Lar*_*ien 11 java performance hibernate ehcache
在集成两个子系统时,我们被迫使用多个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
}
Run Code Online (Sandbox Code Playgroud)
调试打印输出显示STATUS_ALIVE缓存"Foo",但调用size()抛出IllegalStateException:
java.lang.IllegalStateException: The Foo Cache is not alive.
Run Code Online (Sandbox Code Playgroud)
目前,两个SessionFactories都配置为使用SingletonEhCacheRegionFactory.如果我将SessionFactories切换为使用EhCacheRegionFactory(非单例),缓存行为的后果是什么(特别是在Web App上下文中)?
EhCache将确保所有实例在内部SingletonEhCacheRegionFactory使用相同的实际CacheManager,无论SingletonEhCacheRegionFactory您创建多少实例,使其成为Singleton设计模式的原始版本.
EhCacheRegionFactory另一方面,平原CacheManager每次都会得到一个新的.
如果你在Spring中有两个Hibernate会话工厂,每个工厂都使用自己的实例SingletonEhCacheRegionFactory,那么它们实际上最终会共享很多缓存状态,这可能会解决你的问题.
这对于Spring来说并不是一个很好的匹配,因为Spring应该由容器管理单例.如果您使用EhCacheRegionFactory,那么您可能会获得更可预测的结果.我建议你试一试,看看你是怎么过的.
| 归档时间: |
|
| 查看次数: |
3479 次 |
| 最近记录: |