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

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

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

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


person Laimoncijus    schedule 04.01.2012    source источник


Ответы (1)


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

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

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

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

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

person Ken Chan    schedule 04.01.2012
comment
Как насчет закрытия сеанса после завершения работы, выполняется ли это автоматически? - person MounirReg; 20.03.2014
comment
Когда вы используете Hibernate с Spring 3 или более поздней версии, вам следует избегать установки этого свойства, поскольку Spring имеет собственную реализацию этого, которая необходима Spring для управления сеансами Hibernate. stackoverflow.com/a/18842593/3826713 - person UCJava; 17.08.2015