Каковы последствия использования 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), каковы последствия для поведения кэша (в частности, в контексте веб-приложения)?
Ответы
Ответ 1
EhCache гарантирует, что все экземпляры SingletonEhCacheRegionFactory
будут использовать один и тот же фактический CacheManager
внутри, независимо от того, сколько экземпляров SingletonEhCacheRegionFactory
вы создаете, делая его грубой версией шаблона проектирования Singleton.
Простая EhCacheRegionFactory
, с другой стороны, будет получать новый CacheManager
каждый раз.
Если в Spring есть два сеансовых сеанса Hibernate, каждый из которых использует свой собственный экземпляр SingletonEhCacheRegionFactory
, то на самом деле они собираются распределить много своего состояния кеша, что может объяснить вашу проблему.
Это не очень хорошо подходит для Spring, где синглтоны должны управляться контейнером. Если вы используете EhCacheRegionFactory
, то вы, скорее всего, получите более предсказуемые результаты. Я предлагаю вам пойти и посмотреть, как вы поживаете.