Здравствуйте, Pharod, Вы писали:
P>Привет всем,
P>Используем Spring и Hibernate в многопоточном приложении, есть сценарии когда get() делаем в одном трэде а сохранием в базу обновленный уже в другом трэде. насколько я понимаю, Spring — мы используем HibernateTemplate — привязывает открытые сессии к трэдам с помощью ThreadLocal — в итоге мы видим исключение — "HibernateException: Illegal attempt to associate a collection with two open sessions". P>Как "попросить" Spring использовать одну long-live сессию для всего приложения? Или есть еще варианты решения
Можно попробовать сессии закрывать в reader thread перед тем, как поместить объект в пул, тогда к моменту когда Spring попытается привязать объект к сессии из writer thread он не будет ругаться на вторую открытую сессию. Можно ещё попробовать жадно загружать объекты, чтоб ссылок на сессию в коллекциях не было, но тут я могу ошибаться, возможно они всё равно будут — глубже копаться не охота.
Использовать одну long-live сессию для всего приложения вряд ли получиться, авторы задумывали её для другого: An instance of Session is lightweight and is inexpensive to create and destroy. This is important because your application will need to create and destroy sessions all the time, perhaps on every request.
Как показывает опыт, попытки использовать Hibernate не так, как авторы изначально задумывали, чреваты.