Подтвердить что ты не робот

Spring + Управление сеансом Hibernate для нескольких потоков

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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