Hibernate开发之二级缓存
一丶概述
(一)缓存:缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。
(二)Hibernate提供了2个级别的缓存:第一级别的缓存是 Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,第二级别的缓存是 SessionFactory级别的缓存,它是属于进程范围的缓存。由于Hibernate的二级缓存是作用在SessionFactory范围内的,因而它比一级缓存的范围更广,可以被所有的Session对象所共享。
(三)根据功能和目的不同,SessionFactory级别的缓存又分为2类:
(1)内置缓存: Hibernate 自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate 会把映射元数据和预定义的 SQL语句放到SessionFactory的缓存中,该内置缓存是只读的.。
(2)外置缓存:一个可配置的缓存插件,在默认情况下,SessionFactory不会启用这个缓存插件。外置缓存中的数据是数据库数据的复制,外置缓存的物理介质可以是内存或硬盘。
二丶二级缓存的适用条件
并不是所有对象都适合放在二级缓存中,在通常情况下会将具有以下特征的数据放入到二级缓存中:
(1)很少被修改的数据
(2)不是很重要的数据,允许出现偶尔并发的数据
(3)参考数据
而对于具有以下特征的数据则不适合放在二级缓存中:
(1)经常被修改的数据
(2)财务数据,绝对不允许出现并发。
(3)与其他应用共享的数据。
三丶配置二级缓存
(一) 选择合适的缓存插件:这里我直接选用EHCache(jar包和配置文件)
Jar包在hibernate-release-4.3.0.Final\lib\optional\ehcache\.*目录下,而配置文件则在hibernate-release-4.3.0.Final相应文件中。
在默认情况下,EHCache会到classpath所指定的路径中寻找ehcache.xml文件来作为EHCache的配置文件。在配置文件中,包含EHCache进行缓存管理时的一些基本的参数。具体配置如下:
<ehcache>
<diskStorepath="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<cache name="sampleCache1"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
</ehcache>
其中各个参数含义是:
<diskStore>:指定一个目录:当 EHCache 把数据写到硬盘上时, 将把数据写到这个目录下.
<defaultCache>:设置缓存的默认数据过期策略
<cache> 设定具体的命名缓存的数据过期策略。每个命名缓存代表一个缓存区域,缓存区域(region):一个具有名称的缓存块,可以给每一个缓存块设置不同的缓存策略。如果没有设置任何的缓存区域,则所有被缓存的对象,都将使用默认的缓存策略。即:<defaultCache.../>
(二)Hibernate的配置文件中启用二级缓存并指定和EHCache对应的缓存提供类
<!-- 配置二级缓存 -->
<!-- 启用二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 配置使用的二级缓存的产品 -->
<propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
(三)选择需要使用二级缓存的持久化类, 设置它的二级缓存的并发访问策略
<class> 元素的 cache 子元素表明 Hibernate 会缓存对象的简单属性, 但不会缓存集合属性, 若希望缓存集合属性中的元素, 必须在 <set> 元素中加入 <cache> 子元素。代码示例如下:
<cache usage="read-only"/>
在 hibernate 配置文件中通过 <class-cache/> 节点配置使用缓存
<class-cacheusage="read-only"class="com.lkx.hibernate.domain.Class"/>
四丶查询缓存
对于经常使用的查询语句, 如果启用了查询缓存, 当第一次执行查询语句时, Hibernate 会把查询结果存放在查询缓存中. 以后再次执行该查询语句时, 只需从缓存中获得查询结果, 从而提高查询性能
查询缓存使用于如下场合:
应用程序运行时经常使用查询语句
很少对与查询语句检索到的数据进行插入, 删除和更新操作
启用查询缓存的步骤
配置二级缓存, 因为查询缓存依赖于二级缓存
在 hibernate 配置文件中启用查询缓存
对于希望启用查询缓存的查询语句, 调用 Query 的 setCacheable() 方法