Hibernate的会话线程安全吗?

M.J*_*.J. 18 java session hibernate thread-safety hibernate-session

我需要知道,Hibernate的会话是否是线程安全的.但很明显,每个线程都会附加一个新会话来执行.但我的问题是,如果在一个线程中我更新了一个实体的某个值,那么在同一时间执行期间会反映在其他线程中吗?

我的问题是当我从两个线程顺序触发更新时,值正确更新但是当我几乎完全触发更新时它就失败了.

例如.现阶段的表.

  ID      NAME      MARKS
------- --------- --------
  1       John       54
Run Code Online (Sandbox Code Playgroud)

我想做的是:

Student student = session.load(Student.class, 1);
student.setMarks(student.getMarks() + 1);
session.update(student);
session.close();
Run Code Online (Sandbox Code Playgroud)

当我尝试在循环中运行上面的代码时说10,那么表"student"中的"标记"的值被正确更新,即值被更新为64,这是正确的.

但是当我尝试在线程环境中运行相同的代码时,它会产生错误的结果.

Boz*_*zho 21

并不意味着实现者是线程安全的.相反,每个线程/事务应从SessionFactory获取自己的实例.

即使考虑到这一点,您的行为可能仍然不是您所期望的,因为交易发挥作用.您必须设置适当的事务隔离级别.请参阅配置指南,hibernate.connection.isolation属性.


Pet*_*ans 18

Hibernate会话和线程不混合.

您不应该同时使用多个线程的会话,我建议您仅使用单个线程中的会话.数据库会话实现甚至不需要是安全的.

当你开始在多个线程中做事时,你还必须考虑事务会发生什么.事务与当前线程相关联.这变得很快,你进入了实施者没有测试过他们产品的领域.

到最后,生命太短暂,不能迷失在沼泽中.


Sum*_*ada 6

这取决于您如何创建会话。

在hibernate中可以通过两种方式创建Session。

  1. 获取当前会话()

是的。它提供线程安全性,因为如果会话不存在,它将确保为每个线程创建一个会话。交易和自动会话关闭附于此。

  1. 打开会话()

它不是线程安全的。开发人员需要手动管理事务以及会话刷新和关闭操作。