14

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

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

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

4

1 回答 1

15

是的。就够了。

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

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

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

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

于 2012-01-04T08:10:21.370 回答