Spring + Hibernate session management across multiple threads

旧城冷巷雨未停 提交于 2019-12-20 12:06:37

问题


I am building a system, where each request from a client side spawns multiple threads on server side. Each thread then is using one or more DAOs (some DAOs can be used by more than one thread at the time). All DAOs are injected (@Autowired) to my thread classes by Spring. Each DAO receives SessionFactory injected as well.

What would be proper way of managing Hibernate sessions across these multiple DAOs so I would not run into problems because of multithreaded environment (e.g. few DAOs from different threads are trying to use the same session at the same time)?

Would be enough that I specify hibernate.current_session_context_class=thread in Hibernate configuration and then everytime in DAO simply use SessionFactory.getCurrentSession() to do the work? Would it properly detect and create sessions per thread as needed?


回答1:


Yes. It is enough.

When setting hibernate.current_session_context_class to thread , the session returned from SessionFactory.getCurrentSession() is from the ThreadLocal instance .

Every thread will have their own, independently ThreadLocal instance , so different threads will not access to the same hibernate session .

The behaviour of SessionFactory.getCurrentSession() is that : if it is called for the first time in the current thread, a new Session is opened and returned . If it is called again in the same thread , the same session will be returned.

As a result , you can get the same session to use in different DAO methods in the same transaction code by simply calling SessionFactory.getCurrentSession() . It prevent you from passing the Hibernate session through the DAO method 's input parameters in the case that you have to call many different DAO methods in the same transaction code .



来源:https://stackoverflow.com/questions/8723596/spring-hibernate-session-management-across-multiple-threads

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!