2011-09-05 76 views
3

我想使用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是否匹配。這個結果是正確的(儘管在我的情況下,ALL_CACHE_MANAGERS中只有一個CacheManager),並且diskStorePath變得笨拙地重命名。

日誌警告建議考慮單身人士CacheManager。我關於緩存管理器的知識並不深,但我無意使用多個(特別是使用不同的設置)。按照文檔中的建議,我訪問net.sf.ehcache.CacheManager的唯一方法是通過CacheManager.getInstance()

任何人都可以在這裏發光?這是一個錯誤?

我正在使用Ehcache版本2.4.4。

完整堆棧跟蹤:

[email protected], 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) 
    ... 

在此先感謝。

回答

2

這個問題來自我在hibernate綁定中使用EhCacheRegionFactory的事實(特定的緩存與Hibernate根本沒有關係,而是在同一個文件中定義)。

我已切換到SingletonEhCacheRegionFactory並且問題消失了。