4

我和我的一位同事一直在争论何时(如果?)缓存在二级缓存中的集合可以返回陈旧数据(我们使用的是 ehcache 和 hibernate 3.2.4 )。

这是场景:

  • 父对象 P 被缓存并且是一个实体。
  • 父母有一个缓存和懒惰的孩子的集合(袋子)。
  • 子对象 C 被缓存并且是实体。
  • 我们使用非严格读写作为我们所有这些的缓存并发策略。
  • 我们的会话工厂是进程范围的,只涉及 1 个 JVM。
  • 假设上述所有缓存的缓存区域足够大,可以轻松地将所有子项和父项的所有实例保存在内存中。

在时间 T1:通过执行 session.load(p) 并迭代子集合来加载父 P 和子 C1...CN,以便加载所有 C1...CN。

在时间 T2:另一个会话加载 C1 并更新 C1 更改其一些数据。

在什么情况下我可以调用 P.getChildren().get(0) 并且会返回 C1 的旧版本(在 T1 时间加载的 C1 版本)?

我想有两个:

  1. 如果我与 T1 中的操作处于同一休眠会话中(在这种情况下,将返回会话缓存版本)
  2. 使用非严格读写,可能会出现竞争条件,其中 T2 的更新和加载几乎同时发生,并且加载赢得了竞争并从缓存中检索过时的对象。(在这种情况下,我可以改为读写,我会没事的)
4

0 回答 0