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,这是正确的.
但是当我尝试在线程环境中运行相同的代码时,它会产生错误的结果.
Pet*_*ans 18
Hibernate会话和线程不混合.
您不应该同时使用多个线程的会话,我建议您仅使用单个线程中的会话.数据库会话实现甚至不需要是安全的.
当你开始在多个线程中做事时,你还必须考虑事务会发生什么.事务与当前线程相关联.这变得很快,你进入了实施者没有测试过他们产品的领域.
到最后,生命太短暂,不能迷失在沼泽中.
这取决于您如何创建会话。
在hibernate中可以通过两种方式创建Session。
是的。它提供线程安全性,因为如果会话不存在,它将确保为每个线程创建一个会话。交易和自动会话关闭附于此。
它不是线程安全的。开发人员需要手动管理事务以及会话刷新和关闭操作。
| 归档时间: |
|
| 查看次数: |
41964 次 |
| 最近记录: |