2010-06-30 59 views
4

我正在緩存以異步方式發送到我的組件的對象。換句話說,這些對象到達的順序是不可預知的。爲了避免任何問題,我在我的對象中包含了一個版本屬性(基本上是一個時間戳)。這個想法是,任何到達的版本比已經被緩存的版本早,它可以被丟棄。如何在EHCache實例中使用元素版本控制?

EHCache的「Element」類(包裝EHCache中的對象)似乎有助於實現這一點:除了鍵和值之外,構造函數可以採用(基於長的)版本。我無法按照我預期的方式開展工作。下面的代碼片段演示了我的問題(使用的EHCache 2.1.1):

public static void main(String[] args) { 
    final CacheManager manager = CacheManager.create(); 
    final Cache testCache = new Cache(new CacheConfiguration("test", 40)); 
    manager.addCache(testCache); 

    final String key = "key"; 
    final Element elNew = new Element(key, "NEW", 2L); 
    testCache.put(elNew); 
    final Element elOld = new Element(key, "OLD", 1L); 
    testCache.put(elOld); 

    System.out.println("Cache content:"); 
    for (Object k : testCache.getKeys()) { 
     System.out.println(testCache.get(k)); 
    } 
} 

我希望上面的代碼,以使緩存值是「新」,而是「舊」被打印出來。如果您按插入元素的順序玩一下,您會發現插入的最後一個元素將保留在緩存中。版本控制似乎被忽略。

我沒有正確使用版本控制功能,或者它可能不是用於此目的?任何人都可以推薦替代品

回答

2

EhCache顯然忽略了version字段的值 - 其含義由用戶定義。因此,EhCache會使用版本1L覆蓋版本2L,而不知道版本號的含義。

見1)http://jira.terracotta.org/jira/browse/EHC-765

它決定提供一個內部版本計劃爲所有用戶將 造成不必要的開銷。相反,我們現在保留 版本值,以使其完全在用戶的控制之下 。

2)http://jira.terracotta.org/jira/browse/EHC-666

[...]我更希望由馬立克提出的解決方案,我們授予他對版本屬性的 用戶完全控制,並在不發生變異它 全部內部。這可以防止大部分用戶對性能產生影響,並允許用戶靈活地使用他們認爲合適的 。 [...]

正如格雷格通過電子郵件達成的一致,我按照我最後的評論將其固定爲 。


我想用version領域可能會導致競爭條件,導致一個線程有一些什麼有些舊版本覆蓋緩存項的上的最新版本。因此,在我的應用程序中,我有一個記錄數據庫最新版本的計數器,當我加載一個與最近數據庫版本值不同的version字段的緩存值時,我知道緩存值可能過時並忽略它。