我想使用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)
...
提前致谢。
答案 0 :(得分:2)
问题来自我在hibernate绑定中使用EhCacheRegionFactory
的事实(特定缓存根本与Hibernate无关,但在同一文件中定义)。
我已切换到SingletonEhCacheRegionFactory
,问题就消失了。