【问题标题】:Ehcache set to eternal but forgets elements anyway?Ehcache 设置为永恒但还是忘记了元素?
【发布时间】:2012-02-16 01:40:35
【问题描述】:

我正在尝试配置 Ehcache(2.5 版),使其永远不会忘记项目。我正在以编程方式进行配置,并且没有触及任何配置 XML 文件。通过将eternal 设置为true,我的理解是,可以从缓存中删除项目的唯一情况是磁盘空间不足或超过maxBytesLocalDisk(或应用程序终止)。但是,此测试程序没有显示该行为:

public static void main(String[] args) {
  CacheManager cacheManager = CacheManager.create(); 
  Cache cache = new Cache(
    new CacheConfiguration().name("test")
    .overflowToDisk(true)
    .eternal(true)
    .maxBytesLocalHeap(1, MemoryUnit.MEGABYTES)
    .overflowToOffHeap(false)
    .maxBytesLocalDisk(100, MemoryUnit.GIGABYTES)
    .maxElementsOnDisk(0)
    .timeToIdleSeconds(0)
    .timeToLiveSeconds(0)
    .diskStorePath("E:\\Data\\Ehcache"));
  cacheManager.addCache(cache);
  for(int i = 0; i < 1000000; i++){
    cache.put(new Element("key_" + i, "value_" + i));
  }
  System.out.println(cache.getSize());      
}

因此,在我的缓存中添加 100 万个元素后,我告诉它溢出到一个足够大的数量级的磁盘,最后我只得到了 3276 个元素。这里发生了什么?

【问题讨论】:

    标签: java caching ehcache


    【解决方案1】:

    当使用 ARC 或基于字节的缓存配置时,Ehcache 将尝试保护您的 OOME 系统。像您一样配置缓存,告诉 ehcache 您希望此缓存最多使用 1 兆字节的堆。溢出到磁盘告诉 Ehcache 在堆填充到阈值时将元素溢出到磁盘。现在,此缓存的键集仍将保留在堆上。而且,由于 Ehcache 仍然试图保护您免受 OOME 的影响,因此一旦密钥集不能再保存在内存中,它就需要从磁盘中逐出。

    我稍微更改了您的配置以使用 10MB,我可以在缓存中获得 32K 条目。如果我将您的密钥更改为更小(仅 Integer 实例),我可以在缓存中获得 46K 条目。但基本上,您使用的这种配置是有限制的,因为 Ehcache 永远无法在磁盘上保存那么多,而密钥设置在堆上。希望这能澄清一点。

    如果您确实有需要在磁盘上放置大量数据并最小化堆上存储的用例,您可能需要查看http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

    【讨论】:

    • 我实际上并不打算只使用 1MB 的堆;我设置它只是为了确保我会达到需要溢出到磁盘的地步。我将使用几 GB 的堆,但我想确保将其配置为绝对不会忘记元素。
    • 我想这回答了问题,所以请see my new question 了解是否有任何方法可以确保元素永远从磁盘存储中被驱逐(在免费版本)。
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 2014-12-26
    • 2016-08-14
    • 2018-07-16
    • 2013-03-27
    • 1970-01-01
    • 2016-01-12
    • 2013-10-20
    相关资源
    最近更新 更多