1.文章转载于:http://hi.baidu.com/xusuofei/blog/item/d7b43ffae7f9a48d9e51468f.html
2.Hibernate的二级缓存之查询缓存
对于经常使用的查询语句,如果启用了查询缓存,当第一次执行查询语句时,Hibernate会把查询结果存放到二级缓存中。以后再次执行该查询语句时,只需要从缓存中获得结果,从而提高了查询性能。
2.1适用的场合
(1)在应用程序运行中经常使用的查询语句
(2)很少对查询语句关联的数据库数据进行CUD(Create, Update, Delete)操作
2.2Hibernate的Query缓存策略的过程
Hibernate首先根据这些信息组成一个Query Key,Query Key包括条件查询的请求的一般信息:SQL,SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows)。
Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在,那么返回这个结果列表;如果不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放到Query缓存中。
Query Key中的SQL涉及到一些表名,如果这些表的任何数据发生修改,删除,增加操作,这些相关的Query Key都要从缓存中清空。
2.3启用查询缓存的步骤:
(1)配置二级缓存
Hibernate提供了三种和查询相关的缓存区域
1)默认的查询缓存区域:org.hibernate.cache.StandardQueryCache
2)用户自定义的查询缓存区域
3)时间戳缓存区域:org.hibernate.cache.UpdateTimestampCache
默认的查询缓存区域以及用户自定义的查询缓存区域都用于存放查询的结果,而时间戳区域存放了对与查询结果相关的表进行插入,更新或删除操作的时间戳。Hibernate通过时间戳缓存区域来判断被缓存的查询结果是否过期。否则,当应用程序对数据库的相关数据做了修改,Hibernate会自动刷新缓存的查询结果。但是如果其他应用程序对数据库的相关数据做了修改,则无法监测,此时必须由应用程序负责监测这一变化,然后手工刷新查询结果。Query接口的setForceCacheRefresh(true)可以手工刷新查询结果。
(2)在ehcahe.xml中添加如下配置:
<!-- 设置默认的查询缓存的数据过期策略 -->
<cache name="org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="50"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="7200"
overflowToDisk="true"/>
<!-- 设置时间戳缓存的数据过期策略 -->
<cache name="org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000"
eternal="true"
overflowToDisk="true"/>
<!-- 设置自定义命名查询缓存customerQueries的数据过期策略 -->
<cache name="myCacheRegion"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
(3)打开查询缓存:在hibernate.cfg.xml中添加如下配置
<!--启用查询缓存 -->
<property name="cache.use_query_cache">true</property>
(4)在程序中使用
setCacheable(true);