2012-01-04 2 views
13

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

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

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

ответ

15

Да. Достаточно.

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

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

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

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

+3

Как насчет закрытия сеанса, когда работа выполнена, это делается автоматически? – MounirReg

+1

Когда вы используете Hibernate с Spring 3 или более поздней версией, вы должны избегать установки этого свойства, поскольку Spring имеет собственную реализацию этого, которая необходима Spring для управления сеансами Hibernate. http://stackoverflow.com/a/18842593/3826713 – UCJava

Смежные вопросы