作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解“Hibernate session 不是线程安全的”的含义。我已经知道的(如果我错了,请纠正我):
这解释了在不同 session 之间共享实体时可能会出现的问题。
我无法理解的是,当 Session 在 2 个或更多线程之间共享时可能会出现问题。我知道 Session 中的方法不是线程安全的,可能会导致竞争条件等,但不清楚如何?如果有人可以用示例进行解释或列出一个或多个场景来进行澄清,我将不胜感激。
提前致谢
最佳答案
Java memory model对于以下方面有非常严格的规则:
Session 对象不是线程安全的,这意味着它永远不会被多个线程访问。为此,它不使用线程安全机制:
如果您在两个线程之间共享 Hibernate session ,则一个线程的更改可能对其他线程不可见(没有正确的同步或 volatile 读取)。
每个 Hibernate session 都会获得一个关联的 JDBC 连接(即使 JTA 激进的版本最终也会对一个 JTA 事务数据源发出的所有语句重复使用相同的 JDBC 连接)。一个 JDBC 连接不应该由两个线程访问,因为每个线程应该绑定(bind)到一个且只有一个数据库事务。
关于java - Hibernate Session 和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28447529/
我是一名优秀的程序员,十分优秀!