Sitzungsverwaltung mit Hibernate in einer Swing-Anwendung

7

Wie machen Sie Ihre Hibernate-Sitzungsverwaltung in einer Java Desktop Swing-Anwendung? Verwenden Sie eine einzelne Sitzung? Mehrere Sitzungen?

Hier ein paar Referenzen zum Thema:

Dema 06.11.2008, 13:17
quelle

4 Antworten

10

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.

    
Vladimir Dyuzhev 06.11.2008, 14:02
quelle
4

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 "". "

    
Bruno 05.03.2009 19:40
quelle
4

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:

  • Der Abbruch funktioniert tatsächlich sehr gut mit meinem Ansatz: Wegwerfen der Sitzung.
  • session.flush behebt das Problem der ständig wachsenden Sitzung nicht, wenn Sie mit einer einzelnen Sitzung für die Anwendung arbeiten. Natürlich können Sie mit dem Ansatz, den Sie beschreiben, mit kurzlebigen Sitzungen arbeiten, die gut funktionieren sollten. ABER
  • Sie verlieren viel: Lazy Loading funktioniert nur mit angehängten Objekten, automatische Erkennung von schmutzigen Objekten. Wenn Sie mit losgelösten Objekten (oder Objekten, die keine Entitäten sind) arbeiten, müssen Sie dies selbst tun.
Jens Schauder 07.11.2008 21:58
quelle
1

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.

    
stili 04.12.2008 21:14
quelle