Подтвердить что ты не робот

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

При интеграции двух подсистем мы вынуждены использовать несколько экземпляров 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 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 (non-singleton), каковы последствия для поведения кэша (в частности, в контексте веб-приложения)?

4b9b3361

Ответ 1

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

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

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

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