【问题标题】: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”将看到旧数据,直到它再次从数据库中读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 2016-04-01
      • 2017-11-20
      • 2023-03-07
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多