Ehcache正在为磁盘持久性创建不必要的带时间戳的目录

时间:2011-09-05 13:34:52

标签: java caching persistence ehcache

我想使用Ehcache的磁盘持久性,并能够在重新启动之间保持数据。我的配置如下所示:

<ehcache>

  <diskStore path="/tmp/blah"/>

  <defaultCache
      eternal="true"
      maxElementsInMemory="500"
      overflowToDisk="false"
      memoryStoreEvictionPolicy="LRU"
      statistics="true"/>

  <cache
          name="myCache"
      eternal="true"
      maxElementsInMemory="10"
      maxElementsOnDisk="10000"
      overflowToDisk="true"
      diskPersistent="true"
      memoryStoreEvictionPolicy="LRU"
      statistics="true"/>

</ehcache>

使用上述内容,我注意到不仅/tmp/blah/myCache.data被创建,还/tmp/blah/ehcache_auto_created_<timestamp>/myCache.data。持久化数据进入带时间戳的文件夹,问题是缓存的数据无法在重新启动时重复使用。另外,我一般都没有看到时间戳目录。

经过几个小时的调试后,我发现这来自CacheManager.detectAndFixDiskStorePathConflict方法。此方法循环ALL_CACHE_MANAGERS并检查diskStorePath是否匹配。结果是正确的(尽管在我的案例中CacheManager中只有一个ALL_CACHE_MANAGERS,而diskStorePath被笨拙地重命名。

日志警告建议考虑单身CacheManager。我对缓存管理器的了解并不深,但我无意使用多个(特别是使用不同的设置)。我访问net.sf.ehcache.CacheManager的唯一方法是通过CacheManager.getInstance(),如文档中所述。

有人能在这里说清楚吗?这是一个错误吗?

我使用的是Ehcache版本2.4.4。

完整堆栈跟踪:

main@1, prio=5, in group 'main', status: 'RUNNING'
  at net.sf.ehcache.CacheManager.detectAndFixDiskStorePathConflict(CacheManager.java:612)
  at net.sf.ehcache.CacheManager.configure(CacheManager.java:586)
  at net.sf.ehcache.CacheManager.init(CacheManager.java:359)
  at net.sf.ehcache.CacheManager.<init>(CacheManager.java:228)
  at net.sf.ehcache.hibernate.EhCacheRegionFactory.start(EhCacheRegionFactory.java:79)
  at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:250)
  at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
  ...

提前致谢。

1 个答案:

答案 0 :(得分:2)

问题来自我在hibernate绑定中使用EhCacheRegionFactory的事实(特定缓存根本与Hibernate无关,但在同一文件中定义)。

我已切换到SingletonEhCacheRegionFactory,问题就消失了。