如何在EHCache实例中使用元素版本控制?

时间:2010-06-30 10:49:45

标签: java caching versioning element 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));
    }
}

我希望上面的代码能够使缓存的值为“NEW”,而是打印“OLD”。如果你对插入元素的顺序稍微玩一下,你会发现最后一个插入元素的是保留在缓存中的那个。版本控制似乎被忽略了。

我是否未正确使用版本控制功能,或者它是否可能无意用于此目的?任何人都可以推荐替代品吗?

1 个答案:

答案 0 :(得分:2)

EhCache显然忽略了version字段的值 - 其含义由用户定义。因此,EhCache会使用版本2L覆盖您的版本1L,而不知道版本号的含义。

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

  

决定提供内部版本控制方案   导致所有用户不必要的开销。相反,我们现在离开了   版本值未触及,因此它完全在控制之内   用户。

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

  

[...]我更倾向于Marek提出的解决方案,即我们授予的解决方案   用户完全控制版本属性,不要改变它   在内部。这可以防止对性能产生任何影响   对于大多数用户而言,并允许用户灵活地使用它   他们认为合适。 [...]

     

根据Greg通过电子邮件达成的协议,我将此修复为   根据我上次的评论。


我认为使用version字段可能会导致竞争条件,从而导致一个线程覆盖一个缓存项目的最新版本,其中包含一些旧版本。因此,在我的应用程序中,我有一个计数器,可以跟踪最新版本的数据库,当我加载一个缓存值,其中version字段与最新数据库版本值不同时,我知道缓存的值可能是陈旧的并且忽略它。