Session-Management mit Java Hibernate
Ich habe eine Hibernate-basierte Plattform, gebaut von Staatenlosen servlets (eines dient der Anmeldung eines Benutzers und den rest für die Abfrage der db).
Bin ich mit Hibernate die Sitzungen wie folgt:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
if ((null == session) || (session.isOpen() == false)) {
session = HibernateUtil.getSessionFactory().openSession();
}
Momentan habe ich nicht die Sitzung schließen, am Ende der servlet-um zu vermeiden, dass openSession()
rufen (versuchen, zu verwenden geöffneten Sitzungen, wenn möglich).
Was ist die best practice ? Wann bin ich denn, um diese Sitzungen ?
Kannst du bitte ein Beispiel geben ?
Vielen Dank im Voraus !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die beste Praxis ist in den meisten Fällen-session-per-request. Das heißt, öffnen Sie eine Sitzung auf den Beginn der Verarbeitung einer Anforderung, und schließen Sie es am Ende. Sie können tun, dass in einem Servlet
Filter
zum Beispiel.Dass eine Sitzung für die gesamte Anwendung ist schlecht, weil es ansammeln wird eine Menge von Entitäten, die in Ihrer 1. - level-cache ist ein Speicher-Leck. Es kann auch produzieren undeterministic Ergebnisse, wenn mehrere clients die Verwendung es zur gleichen Zeit.
Dein code ist jedoch nicht mit einer Sitzung für die gesamte Anwendung - es ist mit die "aktuelle Sitzung" - Konzept, das eröffnet eine session und speichert es in einen Kontext (einen
ThreadLocal
zum Beispiel). Aber wenn Sie nicht schließen Sie es, es wird für immer dort bleiben. Plus, wird es die gleichen Probleme wie oben beschrieben, weil threads wiederverwendet werden, in eine web-Anwendung, und einen neuen Auftrag bekommen eine alte, nicht geschlossene Sitzung an einem gewissen Punkt.Seine immer besser zum öffnen einer neuen Sitzung für jede Anforderung, und schließen Sie die Sitzung, sobald die Anforderung verarbeitet wird. Wie
statt
Wenn wir die getCurrentSession () - Methode , tansaction.commit() /rollback() beendet die Verbindung.
Den am besten zu verwalten ist eine hibernate-session öffnen eine neue session für jede Anfrage.
Es hängt alles davon ab, wie erhalten Sie die Sitzung.
"aktuelle Sitzung", die gebunden ist an den Lebenszyklus der Transaktion
und wird automatisch geleert und geschlossen, wenn die Transaktion
beendet (commit oder rollback)
die Sitzung verwalten sich selbst und bündig und schließen Sie es auf "manuell".
Ich besser empfehlen Ihnen die Nutzung des spring framework. Verursachen im Frühjahr können Sie
@Transactional
auf methodenebene und die Sitzung wird automatisch erstellt, geschlossen und durch den Transaktions-manager (es sei denn, Sie sind mit jedem open session in view interceptor) mitAOP
intern behandelt framework.thats all.ist der Frühling Spaß 😀