Sitzungsverwaltung mit Hibernate in einer Swing-Anwendung mit mehreren Threads

Ich arbeite derzeit an einem (ziemlich großen) Haustierprojekt von mir, einer Swing-Anwendung, die von Natur aus multithreaded werden muss. Bei fast allen Benutzerinteraktionen werden möglicherweise Daten von einigen Remoteservern über das Internet abgerufen, da ich weder diese Server noch das Internet selbst kontrolliere. Daher sind lange Antwortzeiten unvermeidlich. Eine Swing-Benutzeroberfläche kann sich offensichtlich nicht selbst aktualisieren, während der EDT beschäftigt ist, sodass alle Remoteserveraufrufe von Hintergrundthreads ausgeführt werden müssen.

Mein Problem:

Daten, die von den Hintergrund-Threads abgerufen werden, werden mit Daten aus einer lokalen (speicherinternen) Datenbank "angereichert" (der Remote-Server gibt IDs / Verweise auf Daten in der lokalen Datenbank zurück). Diese Daten werden später schließlich an den EDT übergeben, wo sie Teil des Ansichtsmodells werden. Einige Entitäten sind zu diesem Zeitpunkt nicht vollständig initialisiert (Lazy-Fetching aktiviert), sodass der Benutzer das Lazy-Fetching z. Scrollen in einer JTable. Da die Ruhezustandssitzung bereits geschlossen ist, wird eine LazyInitializationException ausgelöst. Ich kann nicht wissen, wann das Lazy-Fetching möglicherweise vom Benutzer ausgelöst wird. Daher funktioniert das Erstellen einer Sitzung bei Bedarf bzw. das Anhängen des gelösten Objekts hier nicht.

Ich habe dieses Problem 'gelöst' durch:

Verwenden einer einzelnen (synchronisierten, da Sitzungsinstanzen nicht threadsicher sind) Sitzung für die gesamte AnwendungLazy-Fetching vollständig deaktivieren

Während dies funktioniert, hat die Leistung der Anwendung stark gelitten (manchmal fast unbrauchbar). Die Verlangsamung wird hauptsächlich durch die große Anzahl von Objekten verursacht, die jetzt von jeder Abfrage abgerufen werden.

Momentan denke ich darüber nach, das Design der Anwendung in "Sitzung pro Thread" zu ändern und alle Entitäten, die von Nicht-EDT-Threads abgerufen wurden, in die Sitzung des EDT-Threads zu migrieren (ähnlich wie in "Sitzung pro Thread")Dieser Beitrag in den Hibernate-Foren).

Randnotiz: Probleme im Zusammenhang mit Datenbankaktualisierungen treten nicht auf, da alle Datenbankentitäten schreibgeschützt sind (Referenzdaten).

Alle anderen Ideen zur Verwendung von Hibernatemit Lazy-Loading in diesem Szenario?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage