跨多个线程的Spring + Hibernate会话管理

时间:2012-01-04 07:47:50

标签: multithreading hibernate spring session session-management

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

在这些多个DAO中管理Hibernate会话的正确方法是什么,所以我不会因为多线程环境而遇到问题(例如,来自不同线程的少数DAO试图同时使用同一个会话)?

在Hibernate配置中指定hibernate.current_session_context_class=thread就足够了,然后每次在DAO中只需使用SessionFactory.getCurrentSession()来完成工作吗?它会根据需要正确检测并创建每个线程的会话吗?

1 个答案:

答案 0 :(得分:15)

是。这就够了。

hibernate.current_session_context_class设置为thread时,SessionFactory.getCurrentSession()返回的会话来自ThreadLocal个实例。

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

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

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