使用Hibernate 二级缓存

Hibernate 拥有一级和二级缓存,一级缓存是Session 实现的,天生拥有并且不可拆卸

。Hibernate 使用插件的方式实现二级缓存,默认情况下,二级缓存是关闭的。合理地使用二级缓存可以有效减少对数据库访问的次数,提升应用的整体性能。

对于一个版块Board 对象来说,其实例数目比较少且不常发生更改,User 对象的实例

数目比较多,但也不经常发生变化。而Topic 和Post 的实例数目比较多且较常发生变化。

我们将根据这些PO 的特点使用不同的缓存策略。

配置二级缓存主要有两个步骤。

选择需要使用第三方二级缓存组件(如EHCache、Memcached 等),在基于JPA注解实体对象或SessionFactory 的配置中定义缓存策略。

配置所选第三方缓存组件的配置文件。每种缓存组件都有自己的配置文件,因此需要手工编辑它们的配置文件,并将它们放置在类路径下。对于EHCache 来说,其配置文件为ehcache.xml,而JBossCache 的配置文件为treecache.xml。

我们采用EHCache 缓存实现方案,首先我们通过SessionFactory 的配置启用二级缓存并定义缓存策略,这需要我们调整baobaotao-dao.xml 对于sessionFactory Bean 的配置。

baobaotao-dao.xml

…
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
…
<property name="hibernateProperties">
<props>
<!--① 使用EHCache缓存实现方案-->
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
<propkey="hibernate.cache.use_query_cache">true</prop>
</props>
</property>
<!--② 配置缓存策略-->
<property name="entityCacheStrategies">
<props>
<prop key="com.baobaotao.domain.Board">
nonstrict-read-write,fixedRegion
</prop>
<prop key="com.baobaotao.domain.User">
nonstrict-read-write,freqChangeRegion
</prop>
<prop key="com.baobaotao.domain.Topic">read-write,freqChangeRegion</prop>
<propkey="com.baobaotao.domain.Post">read-write,freqChangeRegion</prop>
</props>
</property>
</bean>
…



在①处,启用了二级缓存,通过hibernate.cache.provider_class指定了缓存实现类。这里,我们使用EHCache 实现方案。在②处定义了缓存策略,Board 使用fixedRegion 缓存区,这个缓存区中使用的对象永不过期且使用内存缓存。而User、Topic 以及Post 则使用freqChangeRegion 缓存区,因为它们数目较大,而且较易发生更改。

为了保证EHCache 能够正常启用,我们需要将EHCache 的类包复制到WebRoot/WEB-INF/lib目录下,你可以在<Spring>/lib/ehcache/ehcache-1.2.4.jar 中找到这个

类包。最后,还需要配置EHCache 的配置文件,将其命名为ehcache.xml 并放置到类路径

下。来看一下ehcache.xml 的配置内容。

ehcache.xml

<ehcache>
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="10000"eternal="false"
overflowToDisk="false" timeToIdleSeconds="0"timeToLiveSeconds="0"
diskPersistent="false"diskExpiryThreadIntervalSeconds="120" />
<!--①存放Board的缓存区-->
<cache name="fixedRegion" maxElementsInMemory="100"
eternal="true" overflowToDisk="false"/>
<!--② 存放User、Topic和Post的缓存区-->
<cache name="freqChangeRegion"maxElementsInMemory="5000" eternal="false"
overflowToDisk="true" timeToIdleSeconds="300"timeToLiveSeconds="1800"/>
</ehcache>


 

在①处定义的fixedRegion 缓存区不使用硬盘缓存,所有对象都在内存中,缓存区中的对象永不过期,这非常适合缓存类似于Board 的实例。在②处定义的freqChangeRegion缓存区使用硬盘缓存,对象在闲置300 秒后就从缓存中清除,且对象的最大存活期限为30分钟,缓存区中最大的缓存实例个数为5000 个,超出此限的实例将被写到硬盘中。这样,我们就完成了Hibernate 二级缓存的所有配置,当启用Spring 时,二级缓存就会开始工作了。

需要注意的是,上述配置的EHCache 只支持单机缓存(更改ehcache.xml 配置,可以支持分布式集群),也就是在群集环境中,每个应用节点的缓存都是相互独立、无法共享的,这造成缓存命中率不高。如果Hibernate 二级缓存要运行在群集环境中,需要第三方缓存组件支持集群能力,目前比较常用的有EHCache、Memcached、JBossCache。其中EHCache、JBossCache 是基于Java 语言的高效缓存组件,它们都支持分布式集群,支持多种方式(JGroup)进行应用节点缓存的同步,缓存可以存储在内存或硬盘中。Memcached服务端是基于C 语言的高性能集中式缓存组件,客户端支持多种语言如Java、C、PHP 等,缓存只能存储在内存中。与分布式缓存不同的是,集中式缓存为每个应用节点提供统一的

缓存服务,因此每个应用节点不涉及缓存同步问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值