4


我已经开始使用 EHCache 作为 JTA UserTransaction 中的事务缓存(XAResource),我看到的东西有点奇怪,至少在我看来,我想了解我的“看到”是否错误或者我的理解。
以下代码将返回false

ut = getUserTransaction();
ut.begin();
MyClass a = myChache.get(key).getValue();
a.changeSomeInnerReferrence(newRefference);
ut.commit();
ut = getUserTransaction();
ut.begin();
MyClass b = myChache.get(key).getValue();
ut.commit();
return a.equals(b);

假设MyClass有一个类型的成员,MyOtherClass并且changeSomeInnerReferrence将引用从当前值更改为参数;还假设 equals 考虑了该成员。
我注意到,除非我在上面的代码myChache.put(key,a)之前添加,否则ut.commit()将返回false.

这是为什么?这是缓存的一般行为吗?我认为一旦调用提交,更改内部引用就会传播到缓存中。

谢谢,
伊泰

4

1 回答 1

2

这里有点前言,我没有在 JTA 的上下文中使用 EHCache。它可能在用户事务中做了一些聪明的事情,但我有点怀疑。

一般规则是 cache.get(key) 返回的元素是按值。对它的更改不一定反映在底层缓存中。如果您想象根本没有内存存储,而只有磁盘存储,那么它背后的原因就很清楚了。磁盘存储需要序列化缓存条目,因此一对 put/get 操作将返回一个不同的 Java 实例。此外,在这种情况下,不清楚 cache.get() 返回的实例的任何更改何时会/应该写回磁盘。使用 put() 可以清楚地说明这一点。

最后,你从 get() 得到的东西是你的责任。你通过 put() 告诉 EHCache 接管。

于 2011-02-08T14:14:09.477 回答