小心缓存管理器

如果使用spring和JPA,则很有可能利用ehcache(或其他缓存提供程序)。 您可以在两种不同的情况下进行此操作:JPA 2级缓存和spring方法缓存。

在配置应用程序时,通常会设置JPA提供程序的二级缓存提供程序(在我的情况下为休眠),并且还使用“缓存”名称空间配置spring。 一切看起来都很好,您将继续进行该项目。 但是有一个警告。 如果采用最直接的方法,则会得到两个单独的缓存管理器,它们加载相同的缓存配置文件。 从本质上来说,这还不错,但是要考虑一下–您是否真的需要两个缓存管理器,以及由此可能引起的问题?

可能你不会。 因此,您必须摆脱冗余管理器。 为此,您需要将spring缓存管理器设置为共享:

<bean id='ehCacheManager'
    class='org.springframework.cache.ehcache.EhCacheManagerFactoryBean'>
    <property name='shared' value='true' />
</bean>

这意味着spring将不会创建缓存管理器的新实例,而是将重用hibernate已经创建的实例。 现在,这里需要考虑一些问题-这取决于bean创建的顺序–是将JPA工厂bean还是缓存管理器工厂bean放在首位。 幸运的是,这与最终结果无关紧要,因为SingletonEhCacheRegionFactory如果找到现有实例,则会重用现有的缓存管理器实例。

因此,现在您已将缓存管理器设置为jvm-singleton。 但是,如果您部署了多个应用程序并且正在使用JMX,则可能会遇到另一个问题。 缓存管理器将其自身注册为JMX bean。 但是,当您有单身人士时,多个应用程序将尝试多次注册同一缓存管理器,这将失败。 结果将是日志中有几个例外,并且无法控制多个模块的缓存管理器。 如果您使用Terracotta之类的东西,则同样的问题会变得很麻烦(缓存管理器的身份很重要)。 幸运的是,您可以轻松解决此问题。 只需向上面显示的bean定义添加一个属性:

<property name='cacheManagerName' value='${module.name}' />

${module.name}是使用PropertyPlaceholderConfigurer解析的PropertyPlaceholderConfigurer并且可以针对每个${module.name}应用程序进行配置,因此每个Web应用程序可以具有不同的模块名称。 这样,可以通过JMX以指定的名称访问缓存管理器。

总体而言,请谨慎使用缓存管理器。 即使在使用不同的缓存,jpa和DI提供程序的情况下,也应验证上述方案。

参考:Bozho的技术博客博客上, 请注意我们JCG合作伙伴 Bozhidar Bozhanov的 缓存管理器

翻译自: https://www.javacodegeeks.com/2013/01/be-careful-with-cache-managers.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值