- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在集成两个子系统时,我们被迫使用多个 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
}
调试打印输出显示缓存“Foo”的 STATUS_ALIVE
但调用 size()
会抛出 IllegalStateException
:
java.lang.IllegalStateException: The Foo Cache is not alive.
目前,两个 SessionFactories 都配置为使用 SingletonEhCacheRegionFactory
。如果我将 SessionFactories 切换为使用 EhCacheRegionFactory
(非单例),缓存行为的后果是什么(特别是在 Web App 上下文中)?
最佳答案
EhCache 将确保 SingletonEhCacheRegionFactory
的所有实例在内部使用相同的实际 CacheManager
,无论您创建了多少个 SingletonEhCacheRegionFactory
实例,使得它是 Singleton 设计模式的粗略版本。
另一方面,普通的 EhCacheRegionFactory
每次都会得到一个新的 CacheManager
。
如果你在 Spring 中有两个 Hibernate session 工厂,每个都使用它们自己的 SingletonEhCacheRegionFactory
实例,那么它们实际上最终会共享它们的大量缓存状态,这可能是你的原因问题。
这与 Spring 不太匹配,其中单例应该由容器管理。如果您使用 EhCacheRegionFactory
,那么您可能会获得更可预测的结果。我建议您试一试,看看您的进展如何。
关于java - 在 Web 应用程序中对 Hibernate 二级缓存使用 SingletonEhCacheRegionFactory 与 EhCacheRegionFactory 有什么含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4513697/
This link (来自 Ehcache 的创建者)说当你只有一个 Hibernate SessionFactory 时应该使用 SingletonEhCacheRegionFactory,当你有多
在集成两个子系统时,我们被迫使用多个 SessionFactory 实例,这导致在与我们的 Hibernate 二级缓存(Terracotta EhCache)交互时出现问题。具体来说: for(C
我从事的一个项目当前正在使用 Hibernate 版本 5.2.15.Final。在配置二级缓存时,项目一直使用 org.hibernate.cache.ehcache.SingletonEhCach
我正在尝试将 Ehcache (2.6.0) 配置为 Hibernate (3.6.4) 二级缓存。我在 spring 上下文文件中设置了以下属性 true true net.sf.ehcache.h
我是一名优秀的程序员,十分优秀!