2016-07-05 1 views
0

Ich entwickelte eine Anwendung mit @Transactional Annotation auf Spring Service-Klasse. Um auf die Datenbankebene zuzugreifen, habe ich die Klasse AbstractDao, die bei Bedarf die aktuelle Sitzung zurückgibt. d.hBest Practices für nicht transaktionale DB-Aufrufe mit Spring MVC und Hibernate

@Autowired 
@Qualifier("sessionFactory") 
private SessionFactory sessionFactory; 

protected Session getSession() { 
    session = sessionFactory.getCurrentSession(); 
} 

protected Criteria createEntityCriteria() { 
    return getSession().createCriteria(persistentClass); 
} 

public List<T> findByCriteria(Criterion criterion) { 
    Criteria criteria = createEntityCriteria(); 
    criteria.add(criterion); 
    return criteria.list(); 
} 

Ich denke an das Entfernen grenzüberschreitende Unterstützung, wie ich wirklich brauche es nicht, und ich möchte die Leistung von db Anrufe verbessern, wie ich viele Anzahl von db Einsätze pro Sekunde unterstützen.

1) Ist es in Ordnung, nicht transnationale db-Operationen mit Hibernate und Spring zu verwenden?

2) Wie kann ich den obigen Code ändern, um nicht Transaktionen zu unterstützen? Kann ich obigen Code wie folgt erstellen?

So createEntityCriteria() kann getSession() abrufen Sitzung. So können wir eine Sitzung pro Benutzeranforderung (HTTP-Spring-MVC-Anfrage) mit dem obigen Code verwalten.

Wenn es OK ist, sollte ich Sitzung am Ende der Benutzeranforderung schließen? Wenn also 300 MVC-Benutzeranforderungen pro Sekunde vorliegen, werden 300 JDBC-Aufrufe an die Datenbank geöffnet (da sessionFactory.openSession() einen neuen JDBC-Aufruf erstellt).

+0

Sie sind nicht verpflichtet, Transaktionen zu verwenden, aber Sie sollten hier vorsichtig sein. Transaktionen sind nützlich, vielleicht ist ein bisschen Lesen in Ordnung. https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch13.html – Taylor

Antwort

0

Das Erstellen von Transaktionen ist keine kostspielige Operation. Wenn Sie also einen Methodenaufruf ausführen, der eine schreibgeschützte Operation ausführt, erhalten Sie unter den meisten typischen Anwendungsumgebungen nicht viel Leistung.

Aber immer wenn die Anwendung plant, Daten aus einem bestimmten Grund zu ändern, sollte es in eine Transaktion eingebunden werden, insbesondere wenn Sie mehrere Tabellen ändern, wie eine Entitätsbeziehung ändern usw. Dies stellt sicher, dass die mehrere SQL Anweisungen werden zusammengefügt und sind nur zum Zeitpunkt der Festschreibung aller Änderungen und nicht vorher für andere Sitzungen sichtbar. Dies ist wichtig für die Aufrechterhaltung der Datenbankintegrität.

Insertion Leistung beruht oft stärker auf anderen Faktoren außerhalb ob Sie eine Transaktion, wie das Erstellen, ob Sie wählten einen IDENTITY, AUTO_INCREMENT oder SEQUENCE Primärschlüssel im Vergleich zu einem natürlichen Schlüssel und/oder ob Sie die richtigen JDBC-Set zu verwenden Stapelgröße.

Darüber hinaus wird eine Web-basierte Anwendung wahrscheinlich mehr Leistung Kopfschmerzen in der Web-Framework Umgang mit Code leiden als Sie mit Bedenken, ob Sie eine Transaktion verwenden oder nicht :) leiden.

In Bezug auf JDBC-Aufrufe ist dies wiederum der Bereich, in dem ein Verbindungspool nützlich ist.

Es gibt nur eine angegebene maximale Anzahl von Verbindungen an die Anwendung aus und sobald diese Grenze erreicht ist, können weitere Anfragen für Verbindungen entweder einige Sekunden warten, in der Hoffnung, dass eine Verbindung verfügbar wird, oder sofort eine Ausnahme auslösen. Erlauben der Anwendung, es wie benötigt zu behandeln.

Verwandte Themen