Zarządzanie sesjami przy użyciu Hibernate w * wielowątkowej * aplikacji Swing

Obecnie pracuję nad moim (raczej dużym) projektem dla zwierząt domowych, aplikacją Swing, która ze swej natury musi być wielowątkowa. Prawie wszystkie interakcje użytkowników mogą pobierać dane z niektórych zdalnych serwerów przez Internet, ponieważ nie kontroluję ani tych serwerów, ani samego Internetu, dlatego długie czasy odpowiedzi są nieuniknione. Interfejs Swing UI oczywiście nie może się odmalować, gdy EDT jest zajęty, więc wszystkie wywołania zdalnego serwera muszą być wykonywane przez wątki tła.

Mój problem:

Dane pobierane przez wątki w tle są „wzbogacane” o dane z lokalnej (w pamięci) bazy danych (zdalny serwer zwraca identyfikatory / odniesienia do danych w lokalnej bazie danych). Dane te później zostają przekazane do EDT, gdzie stają się częścią modelu widoku. Niektóre elementy nie są w tym momencie całkowicie zainicjowane (włączone leniwe pobieranie), więc użytkownik może wywołać leniwe pobieranie przez np. przewijanie w JTable. Ponieważ sesja hibernacji jest już zamknięta, spowoduje to wyzwolenie wyjątku LazyInitializationException. Nie wiem, kiedy użytkownik może wywołać leniwe pobieranie, więc utworzenie sesji na żądanie / dołączenie odłączonego obiektu nie będzie działać tutaj.

„Rozwiązałem” ten problem:

użycie pojedynczego (zsynchronizowane, ponieważ instancje Session nie są bezpieczne dla wątków) Sesja dla całej aplikacjicałkowite wyłączenie pobierania leniwego

Chociaż to działa, wydajność aplikacji znacznie ucierpiała (czasami będąc blisko bezużytecznego). Spowolnienie jest spowodowane głównie przez dużą liczbę obiektów, które są teraz pobierane przez każde zapytanie.

Obecnie myślę o zmianie projektu aplikacji na „Session-per-thread” i przeniesieniu wszystkich obiektów pobranych przez wątki inne niż EDT na sesję wątku EDT (podobnie doten wpis na forach Hibernate).

Uwaga dodatkowa: Wszelkie problemy związane z aktualizacjami bazy danych nie mają zastosowania, ponieważ wszystkie jednostki bazy danych są tylko do odczytu (dane referencyjne).

Wszelkie inne pomysły dotyczące korzystania z Hibernatez leniwe ładowanie w tym scenariuszu?

questionAnswers(3)

yourAnswerToTheQuestion