Я хотел использовать постоянство диска 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)
...
Заранее спасибо.