我已经开始使用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().