2010-05-25 78 views
4

我打算在現有的Web應用程序中實現緩存解決方案。沒有什麼複雜的:基本上是支持溢出到磁盤和自動驅逐的併發映射。集羣緩存可能在未來需要,但現在不是。Infinispan相當於ehcache的copyOnRead和copyOnWrite

我喜歡ehcache的copyOnRead和copyOnWrite功能,因爲這意味着在修改我從緩存中取出的內容之前,我不必手動克隆所有內容。現在我開始看Infinispan,但我還沒有發現任何相當的地方。它存在嗎?

即,下面的單元測試應該通過:

@Test 
public void testCopyOnWrite() { 
    Date date = new Date(0); 
    cache.put(0, date); 
    date.setTime(1000); 
    date = cache.get(0); 
    assertEquals(0, date.getTime()); 
} 

@Test 
public void testCopyOnRead() { 
    Date date = new Date(0); 
    cache.put(0, date); 
    assertNotSame(cache.get(0), cache.get(0)); 
} 

回答

2

根據JBoss的開發,Infinispan的還不支持這種功能。您應該在Infinispan issue tracker中記錄改進請求,以便其他人可以對此進行投票(我會)。

話雖這麼說,如果你需要這個功能現在,一個解決方法是擴大AbstractDelegatingCache,並覆蓋getput方法來添加此功能。您可以使用自己的複製策略,或者看看EHCache如何爲其提供靈感。

此外,如果您還有其他問題,您可以考慮Infinispan forum,因爲您將從Infinispan社區獲得更多意見。

+0

謝謝。我相信正確地複製一個對象圖是一個難題(在一般情況下),這就是爲什麼我不想自己做。我會看看ehcache是​​如何做的,就像你所建議的那樣,但是我想我最終會在修改它之前手動複製我從緩存中取出的內容。 – waxwing 2010-05-25 15:44:22

+0

我認爲EHCache用來複制對象的默認策略是使用Java的序列化機制......(序列化對象,然後反序列化它:你得到一個新的實例)。當然,速度很慢,只有在對象是可序列化的情況下才有效(但對於緩存對象通常是這種情況,因爲您經常想將它們寫在磁盤上......)。但是你是對的,複製對象圖是一個難題,我過去使用過Dozer,你也可以看看:http://stackoverflow.com/questions/1432764/any-tool-for-java-object- to-object-mapping – 2010-05-25 16:16:53

+0

找到它:http://svn.terracotta.org/svn/ehcache/trunk/core/src/main/java/net/sf/ehcache/store/compound/SerializationCopyStrategy.java – 2010-05-25 16:22:41

7

Infinispan 確實支持copyOnRead/copyOnWrite,儘管實際格式不可插入。配置元素是lazyDeserialization in Infinispan 4.x和storeAsBinary in Infinispan 5.x.對象使用可插入的Marshaller框架進行序列化,該框架用於所有形式的編組,包括通過網絡進行RPC調用以及存儲到磁盤。

0

我相信storeAsBinary只有當對象需要序列化時纔會生效,這意味着當調用put操作時,所有者不是當前節點。

這也意味着如果密鑰0的所有者不是當前節點,則問題中的測試用例可能會通過,但如果它是單個節點環境,它仍然會失敗。