一尘不染

跨线程的Spring + Hibernate会话管理

hibernate

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

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

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


阅读 227

收藏
2020-06-20

共1个答案

一尘不染

是。够了

当设置hibernate.current_session_context_classthread,从返回的会话SessionFactory.getCurrentSession()是从ThreadLocal实例。

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

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

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

2020-06-20