gpt4 book ai didi

java - 在 Web 应用程序中对 Hibernate 二级缓存使用 SingletonEhCacheRegionFactory 与 EhCacheRegionFactory 有什么含义?

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:33 26 4
gpt4 key购买 nike

在集成两个子系统时,我们被迫使用多个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com