Hibernate Session 和线程安全

Mus*_*afa 3 java multithreading hibernate race-condition hibernate-session

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

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

这解释了在不同会话之间共享实体时可能会出现的问题。

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

提前致谢

Vla*_*cea 5

Java内存模型对于以下方面有非常严格的规则:

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

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

  • 没有互斥锁
  • 无易失性读取
  • 没有同步

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

每个 Hibernate 会话都会获得一个关联的 JDBC 连接(即使 JTA 激进的版本最终也会对一个 JTA 事务数据源发出的所有语句重复使用相同的 JDBC 连接)。一个 JDBC 连接不应该由两个线程访问,因为每个线程应该绑定到一个且只有一个数据库事务。