【问题标题】:How does Hibernate Session handle concurrency performanceHibernate Session 如何处理并发性能
【发布时间】:2016-03-07 06:21:55
【问题描述】:
我对 Hibernate 很陌生,我对 Hibernate 问题进行了缓存处理,但我找不到答案。
例如,线程 A 从 DB 中读取数据,并将其保存在与会话 A 绑定的一级缓存中,然后线程 A 休眠几秒钟。与此同时,另一个线程B在线程A醒来之前修改了DB中的相关数据。那么,线程A检索到的数据会发生什么变化,是线程B修改前的数据还是线程B修改后的数据呢?
如果数据保存在二级缓存中会发生什么,会不会对数据集成产生影响?
【问题讨论】:
标签:
java
multithreading
hibernate
【解决方案1】:
那么,线程A检索到的数据会发生什么,是数据吗?
线程B修改前还是线程B修改后的数据?
线程 A 仍然只有旧数据。因为,each session 有它的own first level cache。要获取更新的数据session 可以再次调用evict(..) 和load 或调用refresh(...) 方法假设线程B 已将数据保存到DB。
那么如果数据保存在二级缓存中会发生什么?
这对数据集成产生了影响?
行为与上述相同。除此之外,如果您在Entity 中设置了version 属性,您还可以使用session.lock(...) 来检测实体更改。例如:LockMode.READ 针对数据库检查 version 属性以检测对它的任何更改,即也通过二级缓存。
【解决方案2】:
“线程 A”将看到旧数据,直到它再次从数据库中读取。