alf*_*onx 7 java multithreading hibernate
我通常在Java Web项目中使用Hibernate ThreadLocal会话管理模式:
Thread Local Session模式利用java.lang.ThreadLocal类创建可从单个应用程序线程访问的Session.这在多线程应用程序(例如Web应用程序)中特别方便.
在我实施的项目中
<property name="current_session_context_class">thread</property>
Run Code Online (Sandbox Code Playgroud)
在hibernate.xml使用SessionFactory.getCurrentSession()时,我需要一个获得一个会话.
现在我有一个不是 Servlet 的程序,但是进行了大量的并行计算和数据库交互.
我想用ForkJoinPool实现它.现在我想知道在这种情况下使用Hibernate ThreadLocal会话管理是否有误.据我所知,ForkJoinPool使用较少数量的线程,并在正在运行的任务之间共享它们,而其他任务正在休眠.(由于在事务'连接中停止/烦人的"任务",我想在一个工作单元之后关闭()每个Hibernate会话.
所以..当我在我的任务结束时调用HibernateSessionFactory.getThreadLocalSession().close()并且任务在ForkJoinPool中运行时 - 会出现麻烦吗?我应该删除ThreadLocal模式以进行大量并行计算并自行管理Sessions吗?
提前感谢您的任何答案.
使用ThreadLocalSessionContext可能对您有问题,但这取决于您正在执行的任务。
一ForkJoinPool(Javadoc中)是指在使用的情况,其中,任务产卵其他任务(叉),并等待它们完成(联接)。在等待期间,执行父任务的线程可以重新用于执行子任务。根据ThreadLocalSessionContext的javadocs ,Session当您提交从中获得的事务时,该事务将关闭(即,每个事务只有一个事务Session)。
因此,如果您有一个“父”任务,该任务调用sessionFactory.getCurrentSession(),然后执行一些操作,然后调用commit(),则Session将关闭,并且不存在不适当交互的危险。
但是,如果.getCurrentSession()在调用之后和调用之前生成子任务.commit(),则可能会遇到问题,因为其他任务可能会在此线程上执行,并.getCurrentSession()会返回父任务使用的会话。几乎可以肯定这不是您想要的,因为子级任务应该在做彼此相同的事情,并且您不希望一个任务Session与父级任意共享状态,而其他任务则不需要。
因此,总而言之,您应该:
session.close()如果Session从获得,请不要致电.getCurrentSession(),因为这是处理的责任CurrentSessionContext。.commit()在产生孩子任务之前先打电话。作为一个脚注,我发现此Wiki页面也对该主题有帮助。