代码之家  ›  专栏  ›  技术社区  ›  Guus khmarbaise

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

  •  4
  • Guus khmarbaise  · 技术社区  · 14 年前

    我正在缓存以异步方式发送到组件的对象。换句话说,这些对象到达的顺序是不可预测的。为了避免任何问题,我为我的对象添加了一个版本属性(基本上是一个时间戳)。其思想是,任何带有比已缓存的版本旧的版本的对象都可以被丢弃。

    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 回复  |  直到 10 年前
        1
  •  2
  •   KajMagnus    10 年前

    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通过电子邮件达成一致,我将此修复为 根据我最后的评论。


    我想用 版本 字段可能会导致争用条件,导致一个线程用稍微旧一些的版本覆盖缓存项的最新版本。因此,在我的应用程序中,我有一个计数器跟踪数据库的最新版本,当我用 版本 字段不同于最新的数据库版本值,我知道缓存的值可能已过时并忽略它。