[英]Spring + Hibernate session management across multiple threads
我正在构建一个系统,其中来自客户端的每个请求都会在服务器端产生多个线程。 然后每个线程使用一个或多个 DAO(某些 DAO 可以同时被多个线程使用)。 Spring 将所有 DAO 注入( @Autowired
)到我的线程类中。 每个 DAO 也接收注入的SessionFactory
。
跨这些多个 DAO 管理 Hibernate 会话的正确方法是什么,这样我就不会因为多线程环境而遇到问题(例如,来自不同线程的几个 DAO 试图同时使用同一个会话)?
我在 Hibernate 配置中指定hibernate.current_session_context_class=thread
然后每次在 DAO 中简单地使用SessionFactory.getCurrentSession()
来完成工作就足够了吗? 它会根据需要正确检测和创建每个线程的会话吗?
是的。 就够了。
将hibernate.current_session_context_class
设置为thread
,从SessionFactory.getCurrentSession()
返回的会话来自ThreadLocal
实例。
每个线程都有自己独立的ThreadLocal
实例,因此不同的线程不会访问同一个休眠会话。
SessionFactory.getCurrentSession()
的行为是:如果在当前线程中第一次调用它,则打开一个新的 Session 并返回。 如果在同一个线程中再次调用,将返回同一个会话。
因此,您可以通过简单地调用SessionFactory.getCurrentSession()
来获得在相同事务代码中的不同 DAO 方法中使用的相同会话。 如果您必须在同一事务代码中调用许多不同的 DAO 方法,它会阻止您通过 DAO 方法的输入参数传递 Hibernate 会话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.