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