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

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

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

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

最佳答案
是.够了

当将hibernate.current_session_context_class设置为线程时,从SessionFactory.getCurrentSession()返回的会话来自ThreadLocal实例.

每个线程都有自己的,独立的ThreadLocal实例,所以不同的线程将不会访问相同的hibernate会话.

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

因此,您可以通过简单地调用SessionFactory.getCurrentSession(),在同一个事务代码中使用不同的DAO方法.它阻止您通过DAO方法的输入参数传递Hibernate会话,因为您必须在同一个事务代码中调用许多不同的DAO方法.

转载注明原文:多线程 – 跨多个线程的Spring Hibernate会话管理 - 代码日志