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)
  ...

Заранее спасибо.


person mindas    schedule 05.09.2011    source источник


Ответы (1)


Проблема возникла из-за того, что я использовал EhCacheRegionFactory в своих привязках к гибернации (конкретный кеш вообще не был связан с гибернацией, но был определен в том же файле).

Я перешел на SingletonEhCacheRegionFactory и проблема ушла.

person mindas    schedule 08.09.2011