java – EHCache是​​否需要put()才能更改实例以反映(XA)?

我已经开始使用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考虑该成员.
我注意到除非我在ut.commit()之前添加myChache.put(key,a),否则上面的代码将返回false.

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

谢谢,
以太

解决方法:

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

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

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

上一篇:java – EhCache:复制与分布式缓存配置


下一篇:如何使springmodules方法缓存中的单个条目无效?