2012-01-04 15 views
13

Buduję system, w którym każde żądanie ze strony klienta spawnuje wiele wątków po stronie serwera. 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 czasie). Wszystkie DAO są wstrzykiwane (@Autowired) do moich klas wątków wiosną. Każdy DAO otrzymuje również iniekcję SessionFactory.Zarządzanie sesją Spring + Hibernate przez wiele wątków

Jaki byłby właściwy sposób zarządzania sesjami Hibernate w tych wielu obiektach DAO, aby nie napotkać problemów z powodu środowiska wielowątkowego (np. Kilka DAO z różnych wątków próbuje używać tej samej sesji w tym samym czasie)?

Czy wystarczy podać hibernate.current_session_context_class=thread w konfiguracji hibernacji, a następnie za każdym razem w DAO po prostu użyć SessionFactory.getCurrentSession() do wykonania pracy? Czy odpowiednio wykrywa i tworzy sesje na wątek?

Odpowiedz

15

Tak. Wystarczy.

Po ustawieniu hibernate.current_session_context_class na thread sesja zwrócona z SessionFactory.getCurrentSession() pochodzi z instancji ThreadLocal.

Każdy wątek będzie miał osobną instancję niezależnie, ThreadLocal, więc różne wątki nie będą miały dostępu do tej samej sesji hibernacji.

Zachowanie SessionFactory.getCurrentSession() polega na tym, że: jeśli jest wywoływana po raz pierwszy w bieżącym wątku, nowa sesja jest otwierana i zwracana. Jeśli zostanie wywołany ponownie w tym samym wątku, ta sama sesja zostanie zwrócona.

W rezultacie można uzyskać tę samą sesję, która będzie używana w różnych metodach DAO w tym samym kodzie transakcji, po prostu wywołując SessionFactory.getCurrentSession(). Zapobiega przechodzeniu sesji Hibernate przez parametry wejściowe metody DAO w przypadku, gdy musisz wywołać wiele różnych metod DAO w tym samym kodzie transakcji.

+3

Co zrobić z zamknięciem sesji po zakończeniu pracy, czy odbywa się to automatycznie? – MounirReg

+1

Kiedy jesteś w Hibernacji ze Spring 3 lub nowszym, powinieneś unikać ustawiania tej właściwości, ponieważ Spring ma własną implementację tego, co jest potrzebne Springowi do zarządzania sesjami Hibernate. http://stackoverflow.com/a/18842593/3826713 – UCJava