Einzelsitzung Starten Sie die Transaktion, wenn Sie mehrere Operationen ausführen müssen (z. B. Aktualisierungsdaten nach Dialogfeld OK-Schaltfläche), übergeben Sie den TX am Ende. Die Verbindung ist jedoch ständig geöffnet (da es die gleiche Sitzung ist), und somit können alle Gelegenheiten zum Zwischenspeichern sowohl von Hib als auch von RDBMS verwendet werden.
Es kann auch eine gute Idee sein, eine transparente Sitzung wieder zu öffnen, falls die Verbindung verloren gegangen ist - Benutzer neigen dazu, Anwendungen für längere Zeiträume offen zu lassen, und sie sollte auch am Montag weiterarbeiten, selbst wenn DB-Server war am Wochenende neu gestartet.
Aktualisieren
Jens Schauder gab einen Grund, mehrere Sitzungen zu verwenden: teilweise (unerwünschte) Aktualisierungen der Sitzung. Nun, das hängt davon ab, wie Sie Hibernate verwenden.
Nehmen wir an, wir haben zwei Dialoge geöffnet (wie in Jens Blog-Beispiel). Wenn der Benutzer auf eine Radiobox klickt und wir sofort eine Hibernate-Entität aktualisieren, die dieser Radiobox zugeordnet ist, sind wir in einem Problem, wenn der Benutzer auf Abbrechen klickt - die Sitzung ist bereits aktualisiert.
Der richtige Weg besteht meines Erachtens darin, nur Dialogvariablen (Nicht-Hibernate-Objekte) zu aktualisieren. Wenn der Benutzer dann auf OK klickt, beginnen wir eine Transaktion, führen aktualisierte Objekte zusammen und übernehmen die Transaktion. Kein Müll wird jemals in Sitzung gespeichert.
%Vor%Wenn wir eine solche saubere Trennung von Bedenken implementieren, können wir später mit einer einfachen Änderung der MyHibernateUtils.begin () - Implementierung zu mehreren Sitzungen wechseln.
Was möglichen Speicherverlust betrifft, naja ... Transaction.commit () ruft Session.flush () auf, was AFAIK auch den Cache reinigt. Man kann die Cache-Richtlinie auch manuell steuern, indem Sie Session.setCacheMode () aufrufen.
Problem mit "'' Sitzung pro Thread ''" ist gut Swing-Anwendungen machen den Datenbankzugriff außerhalb der EDT, normalerweise in neu erstellten SwingWorker-Threads. Auf diese Weise wird "Sitzung pro Thread" schnell zu Sitzung pro Klick "". "
Verwenden Sie keine einzelne Sitzung. Für alles außer den kleinsten Anwendungen wird es wachsen, autodierte Daten sammeln und immer langsamer werden, da der Dirty-Check jede Entität in der Sitzung überprüfen muss.
Wenn Sie lazy loading und tracking von Änderungen durch hibernat nicht benötigen / wollen, können Sie kurzlebige Sitzungen verwenden.
Aber wenn Sie von der Kraft des Winterschlafs profitieren möchten, verwenden Sie den Ansatz, den ich in meinem Blog beschrieben habe: Ссылка
oder in der deutschen Version:
AFAIK es ist wirklich die gleiche Vorgehensweise in der Ссылка beschrieben, aber mit einer Empfehlung, wie Sie Ihre Sitzung tatsächlich erfassen: On Session pro Frame, mit Ausnahme von modalen Frames, die die Sitzung des übergeordneten Frames verwenden.
Achten Sie darauf, niemals Objekte aus verschiedenen Sitzungen zu kombinieren. Es wird viel Ärger verursachen.
Als Antwort auf Vladimirs Update:
Verwenden Sie eine Sitzung pro Thread ( Dokument ) und eine Versions- oder Zeitstempelspalte, um optimistische Parallelität zuzulassen und dadurch zu vermeiden Session-zu-Instanz-Konflikte. Hängen Sie bei Bedarf Instanzen an die Sitzung an, es sei denn, Sie benötigen lange laufende Transaktionen oder eine eingeschränkte Isolationsstufe.