2010-11-14 30 views
4


我已经开始使用EHCache作为JTA UserTransaction中的事务性缓存(XAResource),至少在我的脑海里,我看到了一些有点奇怪的东西,我想了解我的“看到“是错的还是我的理解。
下面的代码将返回falseEHCache是​​否需要put()以便更改实例以反映(XA)?

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改变从电流值于该参数的参考;还假定等于考虑到该成员。
我注意到,除非在ut.commit()之前加上myChache.put(key,a),否则上面的代码将返回false

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

感谢,
以太

回答

2

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

一般规则是cache.get(key)返回的元素是按值创建的。对它的更改不一定反映在底层缓存中。如果您想象根本没有内存存储,但只有磁盘存储,则背后的理由会变得非常清楚。磁盘存储需要序列化高速缓存条目,因此put/get操作对将返回不同的Java实例。此外,在这种情况下,不清楚cache.get()返回的实例的任何更改是否会被写回到磁盘。使用put()明确表示。

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

+0

“一般规则是由cache.get(key)返回的元素的值是”这是缓存作为态度的一般规则吗? – Ittai 2011-02-09 12:54:30

+0

我会这么说,虽然我想不出任何写下来的东西。没有它的价值使得缓存实现者的工作更加困难,因为它限制了他们如何处理他们的数据(持久性,并发性等)。出于这个原因,我认为这是一个例外,可以在cahce知道get()之后可靠地修改条目。 – sharakan 2011-02-09 14:04:42

相关问题