Spring + Управление сеансом Hibernate для нескольких потоков
Я создаю систему, где каждый запрос с клиентской стороны порождает несколько потоков на стороне сервера. Затем каждый поток использует один или несколько DAO (некоторые DAO могут использоваться более чем одним потоком в то время). Все DAO вводятся (@Autowired
) в мои классы потоков с помощью Spring. Каждый DAO получает также SessionFactory
.
Каким будет правильный способ управления сессиями Hibernate через эти множественные DAO, чтобы я не столкнулся с проблемами из-за многопоточной среды (например, несколько DAO из разных потоков пытались использовать один и тот же сеанс одновременно)?
Было бы достаточно, чтобы я указывал hibernate.current_session_context_class=thread
в конфигурации Hibernate, а затем каждый раз в DAO просто используйте SessionFactory.getCurrentSession()
для выполнения этой работы? Будет ли он правильно определять и создавать сеансы на поток при необходимости?
Ответы
Ответ 1
Да. Этого достаточно.
При установке hibernate.current_session_context_class
в thread
сеанс, возвращенный из SessionFactory.getCurrentSession()
, из экземпляра ThreadLocal
.
Каждый поток будет иметь свой собственный, независимо ThreadLocal
экземпляр, поэтому разные потоки не будут иметь доступ к одному сеансу спящего режима.
Поведение SessionFactory.getCurrentSession()
заключается в следующем: если он вызывается в первый раз в текущем потоке, открывается и возвращается новый сеанс. Если он снова вызывается в том же потоке, тот же сеанс будет возвращен.
В результате вы можете использовать один и тот же сеанс в разных методах DAO в одном и том же коде транзакции, просто позвонив SessionFactory.getCurrentSession()
. Это предотвратит передачу сеанса Hibernate через входные параметры метода DAO в случае, когда вы должны вызывать множество разных методов DAO в одном и том же коде транзакции.