Ehcache создает ненужные каталоги с метками времени для сохранения диска - PullRequest
3 голосов
/ 05 сентября 2011

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

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

1 Ответ

2 голосов
/ 08 сентября 2011

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

Я переключился на SingletonEhCacheRegionFactory, и проблема исчезла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...