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);