gpt4 book ai didi

java - 与 ForkJoinPool 兼容的 Hibernate ThreadLocal session 管理?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:29 27 4
gpt4 key购买 nike

我通常在 Java web 项目中使用 Hibernate ThreadLocal session 管理模式:

The Thread Local Session pattern makes use of the java.lang.ThreadLocal class to create a Session that is accessible from a single application thread. This is particularly convenient in multithreaded applications, such as web applications.

在项目中我用

<property name="current_session_context_class">thread</property>

hibernate.xml 中并使用 SessionFactory.getCurrentSession() 在需要时获取 session 。

现在我有一个不是Servlet 的程序,但执行大量并行计算和数据库交互。

我想用 ForkJoinPool 来实现它。现在我想知道在这种情况下使用 Hibernate ThreadLocal session 管理是否是一个错误。据我了解, ForkJoinPool 使用较少数量的线程并在其他任务处于 hibernate 状态时在正在运行的任务之间共享它们。 (受拖延/恼人的“事务连接中的任务”的激励,)我想在一个工作单元后关闭()每个 Hibernate session 。

所以.. 当我在我的任务结束时调用 HibernateSessionFactory.getThreadLocalSession().close() - 并且任务在 ForkJoinPool 中运行时 - 会出现问题吗?我是否应该放弃用于大量并行计算的 ThreadLocal 模式并自己管理 session ?

提前感谢您的回答。

最佳答案

使用 ThreadLocalSessionContext 对您来说可能会有问题,但这取决于您的任务在做什么。

ForkJoinPool ( javadocs ) 用于任务产生其他任务(fork)并等待它们完成(join)的情况。在等待期间,执行父任务的线程可能会被重新用于执行子任务。根据 ThreadLocalSessionContext 的 javadocs , Session 会在您提交从中获得的事务时关闭(即每个 Session 只有一个事务)。

因此,如果您有一个调用 sessionFactory.getCurrentSession() 的“父”任务,并执行一些操作,然后调用 commit(),则 Session 将关闭并且不存在不适当交互的危险.

但是,如果您在调用 .getCurrentSession() 之后和调用 .commit() 之前生成子任务,您可能会遇到问题,因为其他任务可能会在此线程和 .getCurrentSession() 将返回父任务使用的 session 。这几乎肯定不是您想要的,因为子任务大概应该彼此做同样的事情,并且您不希望其中一个与父任务任意共享 Session 状态而其他任务则不这样做.

总而言之,您应该:

  • 如果您从 .getCurrentSession() 获得 Session,则不要调用 session.close(),因为这是 的责任>CurrentSessionContext 来处理这个问题。
  • 在生 child 之前保持忠诚的关系....我的意思是,在产生 child 任务之前调用 .commit()

作为脚注,我找到了 this wiki page也是该主题的有用读物。

关于java - 与 ForkJoinPool 兼容的 Hibernate ThreadLocal session 管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989293/

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