Каковы последствия использования SingletonEhCacheRegionFactory и EhCacheRegionFactory для кэша второго уровня Hibernate в веб-приложении? - PullRequest
11 голосов
/ 23 декабря 2010

При интеграции двух подсистем мы были вынуждены использовать несколько SessionFactory экземпляров, что приводило к проблемам при взаимодействии с нашим кэшем второго уровня Hibernate (Terracotta EhCache). В частности:

 for(CacheManager cm : CacheManager.ALL_CACHE_MANAGERS){
            LOGGER.log(Level.DEBUG, "In cm " + cm.getName());
            for(String cn : cm.getCacheNames()){
                LOGGER.log(Level.DEBUG, "I have a cache called " + cn);
                LOGGER.log(Level.DEBUG, "it's status is " + ms.getCache(cn).getStatus());
            }
        }
  try{
     myCollection.size();
  }catch(IllegalStateException ise){
      LOGGER.log(Level.FATAL, ise);  //Triggered
  }        

Распечатка отладки показывает STATUS_ALIVE для кеша "Foo", но вызов size() выдает IllegalStateException:

java.lang.IllegalStateException: The Foo Cache is not alive.

В настоящее время обе SessionFactories настроены на использование SingletonEhCacheRegionFactory. Если я переключу SessionFactories на использование EhCacheRegionFactory (не одноэлементный), каковы последствия для поведения кэша (особенно в контексте веб-приложения)?

1 Ответ

6 голосов
/ 18 марта 2012

EhCache гарантирует, что все экземпляры SingletonEhCacheRegionFactory будут использовать один и тот же фактический CacheManager внутри, независимо от того, сколько экземпляров SingletonEhCacheRegionFactory вы создадите, что сделает его сырой версией шаблона проектирования Singleton.

С другой стороны, равнина EhCacheRegionFactory будет каждый раз получать новый CacheManager.

Если у вас есть две фабрики сессий Hibernate в Spring, каждая из которых использует свой собственный экземпляр SingletonEhCacheRegionFactory, то они на самом деле в конечном итоге разделят большую часть своего состояния кэша, что может объяснить вашу проблему.

Это не совсем подходит для Spring, где управление синглетами должно осуществляться контейнером. Если вы используете EhCacheRegionFactory, вы, вероятно, получите более предсказуемые результаты. Я предлагаю попробовать и посмотреть, как вы поживаете.

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