Hibernate Session和线程安全

时间:2015-02-11 06:00:34

标签: java multithreading hibernate race-condition hibernate-session

我试图理解' Hibernate会话的含义不是线程安全的'。我已经知道的(如果我错了,请纠正我):

  1. 非JTA环境中的会话保存在Thread Local中。所以它绑定到当前线程。
  2. 在新线程中调用getCurrentSession()会将新会话与其自己的本地线程相关联。
  3. 假设我们在2个线程(T1,T2)之间共享一个实体,在T1中加载并在T2中使用,我们可能会遇到延迟加载等问题,因为T1和T2中的会话不同。
  4. 这解释了在不同会话之间共享实体时可能出现的问题。

    我无法理解的是在两个或多个线程之间共享会话时可能出现的问题。我知道Session中的方法不是线程安全的,可能导致竞争条件等但是不清楚如何?如果有人可以用示例解释或列出一个或多个场景来澄清,我将不胜感激。

    提前致谢

1 个答案:

答案 0 :(得分:2)

Java memory model对以下内容有非常严格的规定:

  • 线程间内存可见性
  • 线程操作重新排序

Session对象不是线程安全的,这意味着它永远不会被多个线程访问。为此,它使用NO线程安全机制:

  • no mutex
  • 没有易失性读取
  • 无同步

如果您在两个线程之间共享一个Hibernate会话,那么一个其他线程可能看不到一个线程更改(没有正确的同步或易失性读取)。

每个Hibernate会话都会获得一个关联的JDBC连接(甚至JTA积极发布,最终为一个JTA事务DataSource发出的所有语句重用相同的JDBC连接)。 JDBC连接不应该由两个线程访问,因为每个线程应该绑定到一个且只有一个数据库事务。