Porównaj ceny domen i usług IT, sprzedawców z całego świata

Zarządzanie sesjami wielowątkowymi Spring + Hibernate


Tworzę system, w którym każde żądanie ze strony klienta powoduje powstanie wielu wątków po stronie serwera. Następnie każdy wątek używa jednego lub więcej DAO (niektóre DAO mogą być używane przez więcej niż jeden wątek w tym samym czasie). Wszystkie DAO są wstrzykiwane (
@Autowired
) do moich klas wątkowych przy użyciu Springa. Każdy DAO otrzymuje również zastrzyk
SessionFactory
.
Jaki byłby właściwy sposób zarządzania sesjami Hibernacji za pośrednictwem tych wielu DAO, aby nie napotkać problemów związanych ze środowiskiem wielowątkowym (np. Wiele DAO z różnych wątków próbuje używać tej samej sesji w tym samym czasie)?
Czy wystarczyłoby, żebym określił
hibernate.current_session_context_class = thread
w konfiguracji Hibernate, a następnie za każdym razem w DAO po prostu użyć
SessionFactory.getCurrentSession ()
, aby wykonać zadanie? Czy prawidłowo wykryje i utworzy sesje dla każdego wątku w razie potrzeby?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Tak. Wystarczy.
Podczas ustawiania wartości
hibernate.current_session_context_class
na
thread
, sesja zwrócona z
SessionFactory.getCurrentSession ()
pochodzi z
ThreadLocal  instancja ... 
Każdy wątek będzie miał własną, niezależną instancję
ThreadLocal
, więc różne wątki nie będą miały dostępu do tej samej sesji hibernacji.
Zachowanie
SessionFactory.getCurrentSession ()
jest następujące: jeśli jest wywoływana po raz pierwszy w bieżącym wątku, nowa sesja jest otwierana i zwracana. Jeśli zostanie ponownie wywołany w tym samym wątku, zostanie zwrócona ta sama sesja.
W rezultacie możesz uzyskać tę samą sesję do użycia w różnych metodach DAO w tym samym kodzie transakcji, po prostu wywołując
SessionFactory.getCurrentSession ()
. Zapobiegnie to przekazywaniu sesji Hibernacji przez właściwości metody DAO w przypadku, gdy będziesz musiał wywołać wiele różnych metod DAO w tym samym kodzie transakcji.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się