【发布时间】:2012-04-16 20:56:42
【问题描述】:
我通常在 Java web 项目中使用 Hibernate ThreadLocal 会话管理模式:
线程本地会话模式利用 java.lang.ThreadLocal 类创建可访问的 Session 从单个应用程序线程。这在 多线程应用程序,例如 Web 应用程序。
在我实现这个的项目中
<property name="current_session_context_class">thread</property>
在hibernate.xml 中,并在我需要时使用SessionFactory.getCurrentSession() 获取会话。
现在我有一个不是 Servlet 的程序,但可以进行大量的并行计算和数据库交互。
我想用 ForkJoinPool 来实现它。现在想知道在这种场景下使用 Hibernate ThreadLocal 会话管理是不是一个错误。据我了解, ForkJoinPool 使用较少数量的线程,并在其他任务处于休眠状态时在正在运行的任务之间共享它们。 (出于拖延/烦人的“事务连接中的任务”的动机,)我想在一个工作单元之后关闭()每个休眠会话。
所以.. 当我在任务结束时调用 HibernateSessionFactory.getThreadLocalSession().close() - 并且任务在 ForkJoinPool 中运行 - 会出现问题吗?我应该放弃 ThreadLocal 模式以进行大量并行计算并自己管理会话吗?
提前感谢您的任何回答。
【问题讨论】:
-
您是使用 SessionFactory.getCurrentSession() 还是 .openSession() 来获取您的 Session 对象?如果 getCurrentSession,您使用的是什么 CurrentSessionContext?我猜是 ThreadLocalSessionContext,但您将其称为“模式”而不是类。
-
感谢您对此进行调查。我更详细地更新了问题。
标签: java multithreading hibernate