Session management mit Hilfe von Hibernate in eine Swing-Anwendung
Wie machen Sie Ihre Hibernate-session-management im Java Desktop Swing-Anwendung? Verwenden Sie eine einzelne Sitzung? Mehrere Sitzungen?
Hier sind ein paar Verweise zum Thema:
- http://www.hibernate.org/333.html
- http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-applications/
- http://in.relation.to/Bloggers/HibernateAndSwingDemoApp
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einzigen Sitzung. Starten Sie die Transaktion, wenn Sie tun müssen, eine Reihe von Operationen (wie die Daten zu aktualisieren, nachdem das Dialogfeld mit OK-Taste), können die commit der tx, am Ende. Die Verbindung ist aber ständig offen (da es die gleiche session), und damit alle Möglichkeiten für das caching verwendet werden, Hib und RDBMS.
Kann es auch eine gute Idee, eine transparente session wieder zu öffnen, falls die Verbindung ging tot-Anwender neigen dazu, lassen Sie die Anwendungen öffnen, für längere Zeit, und es sollte auch weiterhin arbeiten Montag, auch wenn der DB-server wurde neu gestartet, am Wochenende.
Update
Jens Schauder, sofern ein Grund für die Verwendung mehrerer Sitzungen: teilweise (ungewollten) updates für die Sitzung. Naja, das kommt auf die Art und Weise Sie Überwintern.
Angenommen, wir haben zwei Dialoge öffnen (wie in Jens' blog-Beispiel). Klickt der Benutzer auf eine radiobox, und wir haben sofort aktualisieren einer Hibernate-Entität, die im Zusammenhang mit diesen radiobox, dann, wenn der Benutzer auf Abbrechen klickt, dann sind wir in Schwierigkeiten -- Sitzung ist bereits aktualisiert.
Rechts Weg, so wie ich es sehe, ist die update-dialog-Variablen (nicht-Hibernate-Objekte) nur. Dann, wenn der Benutzer auf OK klickt, beginnen wir eine Transaktions -, merge-aktualisierte Objekte, commit der Transaktion. Kein Müll wird immer gespeichert, in eine Sitzung.
Wenn wir die Umsetzung einer solchen sauberen Trennung von Bedenken, wir können später wechseln Sie zu mehreren Sitzungen mit einer einfachen änderung der MyHibernateUtils.begin () - Implementierung.
Als für mögliche memory leak, gut... Transaktion.commit () - Aufrufe Sitzung.flush(), die, soweit ich weiß, reinigt den cache zu. Außerdem, kann man die manuelle Kontrolle des caching-Richtlinie durch Aufruf von Session.setCacheMode().
Problem mit "session"pro-thread"" ist gut Swing-Anwendungen den Zugriff auf die Datenbank außerhalb des EDT, in der Regel in neu erstellten SwingWorker threads. Auf diese Weise, ""session pro thread"" schnell ""session-per-click"".
Nicht mit einer einzigen Sitzung. Für alles außer für kleinste Anwendungen, es wird wachsen, das sammeln von veralteten Daten und wird langsamer und langsamer, da die verschmutzt überprüfen, überprüfen muss, wie jede Person in der Sitzung.
Wenn Sie nicht brauchen/wollen, lazy loading und Nachverfolgung von änderungen von Hibernate, die Sie verwenden können, kurzlebigen Sitzungen.
Aber wenn Sie wollen, profitieren von der macht, von Hibernate verwenden Sie die Methode, die ich beschrieben in meinem blog:
http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-applications/
oder in der deutschen version:
http://blog.schauderhaft.de/2007/12/17/hibernate-sessions-in-fat-client-anwendungen/
AFAIK ist es wirklich den gleichen Ansatz, beschrieben in der http://in.relation.to/Bloggers/HibernateAndSwingDemoApp aber mit einer Empfehlung, wie man eigentlich Rahmen Ihrer Sitzung:
Session pro Frame, mit Ausnahme von modalen Frames, die die Sitzung des übergeordneten Rahmens.
Nur stellen Sie sicher nie um Objekte zu kombinieren aus verschiedenen sessions. Es wird dazu führen, viel ärger.
In der Antwort auf Vladimirs update:
Verwenden Sie eine session pro thread (doc) und eine version oder eine timestamp-Spalte zu ermöglichen, vollständige Parallelität und damit die Vermeidung von session-to-Instanz Konflikte. Befestigen Sie Instanzen der Sitzung, wenn erforderlich, es sei denn, Sie müssen lange laufende Transaktionen oder eine restriktive Isolationsstufe.