2010-11-14 64 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

相關問題