Multithreading 弹簧&x2B;跨多线程休眠会话管理

Multithreading 弹簧&x2B;跨多线程休眠会话管理,multithreading,hibernate,spring,session,session-management,Multithreading,Hibernate,Spring,Session,Session Management,我正在构建一个系统,其中来自客户端的每个请求都会在服务器端生成多个线程。然后,每个线程都在使用一个或多个DAO(一些DAO可以同时由多个线程使用)。Spring将所有DAO(@Autowired)注入到我的线程类中。每个DAO也接收注入的SessionFactory 什么是跨多个DAO管理Hibernate会话的正确方法,这样我就不会因为多线程环境而遇到问题(例如,来自不同线程的几个DAO试图同时使用同一个会话) 我在hibernate配置中指定hibernate.current\u sessi

我正在构建一个系统,其中来自客户端的每个请求都会在服务器端生成多个线程。然后,每个线程都在使用一个或多个DAO(一些DAO可以同时由多个线程使用)。Spring将所有DAO(
@Autowired
)注入到我的线程类中。每个DAO也接收注入的
SessionFactory

什么是跨多个DAO管理Hibernate会话的正确方法,这样我就不会因为多线程环境而遇到问题(例如,来自不同线程的几个DAO试图同时使用同一个会话)

我在hibernate配置中指定
hibernate.current\u session\u context\u class=thread
,然后每次在DAO中只需使用
SessionFactory.getCurrentSession()
就可以了吗?它能根据需要正确地检测和创建每个线程的会话吗?

是。够了

hibernate.current\u session\u context\u class
设置为
thread
时,从
SessionFactory.getCurrentSession()
返回的会话来自
ThreadLocal
实例

每个线程都有自己独立的
ThreadLocal
实例,因此不同的线程不能访问同一个hibernate会话

SessionFactory.getCurrentSession()
的行为是:如果在当前线程中第一次调用它,将打开并返回一个新会话。如果在同一线程中再次调用,将返回同一会话


因此,只需调用
SessionFactory.getCurrentSession()
,就可以在同一事务代码中的不同DAO方法中使用相同的会话。如果必须在同一事务代码中调用多个不同的DAO方法,它会阻止您通过DAO方法的输入参数传递Hibernate会话。

工作完成后关闭会话如何,它是自动完成的吗?当您使用Spring3或更高版本进行Hibernate时,应该避免设置此属性,因为Spring有自己的实现,这是Spring管理Hibernate会话所必需的。