我的一位同事和我一直在讨论何时(如果?)在二级缓存中缓存的集合可以返回陈旧数据(我们正在使用ehcache和hibernate 3.2.4)。
以下是该方案:
- 父对象P被缓存并且是一个实体。
- Parent有一个缓存和懒惰的子集合(包)。
- 子对象C被缓存并且是实体。
- 我们使用Nonstrict读写作为所有这些的缓存并发策略。
- 我们的会话工厂是进程范围的,只涉及1个JVM。
- 假设上面所有缓存的缓存区域足够大,可以轻松地将所有子节点和父节点的所有实例都保存在内存中。
在时间T1:通过执行session.load(p)并迭代子集合来加载父P和子C1 ... CN,以便加载所有C1 ... CN。
在时间T2:另一个会话加载C1并更新C1,改变其部分数据。
在什么情况下我可以调用P.getChildren()。get(0)和陈旧版本的C1(在T1时刻加载的C1的版本)将被返回?
我在想有两个:
- 如果我和T1中的操作处于相同的休眠会话中(在这种情况下会返回会话缓存版本)
- 使用非严格的读写操作,可能会出现竞争条件,其中T2的更新和加载几乎在同一时间发生,并且负载赢得竞争并从高速缓存中检索过时的对象。 (在这种情况下,我可以改为读写,我会没事的)
醇>