gpt4 book ai didi

multithreading - Spring + Hibernate 跨多个线程的 session 管理

转载 作者:IT老高 更新时间:2023-10-28 13:55:03 26 4
gpt4 key购买 nike

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

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

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

最佳答案

是的。够了。

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

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

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

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

关于multithreading - Spring + Hibernate 跨多个线程的 session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8723596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com