Spring + Hibernate управление сессиями в нескольких потоках - PullRequest
14 голосов
/ 04 января 2012

Я строю систему, в которой каждый запрос со стороны клиента порождает несколько потоков на стороне сервера.Каждый поток тогда использует один или несколько DAO (некоторые DAO могут использоваться более чем одним потоком одновременно).Все DAO внедряются (@Autowired) в мои классы потоков Spring.Каждый DAO получает также SessionFactory инъекций.

Каков будет правильный способ управления сеансами Hibernate в этих нескольких DAO, чтобы я не столкнулся с проблемами из-за многопоточной среды (например, несколько DAO из разных потоков пытаются использовать один и тот же сеанс одновременно)?

Было бы достаточно, чтобы я указал hibernate.current_session_context_class=thread в конфигурации Hibernate, а затем каждый раз в DAO просто использовал SessionFactory.getCurrentSession() для выполнения работы?Будет ли он правильно определять и создавать сеансы для каждого потока по мере необходимости?

1 Ответ

15 голосов
/ 04 января 2012

Да. Этого достаточно.

При установке hibernate.current_session_context_class на thread сеанс, возвращаемый с SessionFactory.getCurrentSession(), происходит из экземпляра ThreadLocal.

Каждый поток будет иметь свой собственный, независимо ThreadLocal экземпляр, поэтому разные потоки не будут иметь доступа к одному и тому же сеансу гибернации.

Поведение SessionFactory.getCurrentSession() таково: если он вызывается впервые в текущем потоке, новый сеанс открывается и возвращается. Если он вызывается снова в том же потоке, будет возвращен тот же сеанс.

В результате вы можете получить один и тот же сеанс для использования в разных методах DAO в одном и том же коде транзакции, просто вызвав SessionFactory.getCurrentSession(). Он не позволяет передавать сеанс Hibernate через входные параметры метода DAO в случае, если вам нужно вызывать много разных методов DAO в одном и том же коде транзакции.

...