1. 程式人生 > >Hibernate的Query快取策略

Hibernate的Query快取策略

啟用查詢快取的步驟:

1) 配置二級快取:

Hibernate提供了三種和查詢相關的快取區域:

· 預設的查詢快取區域:org.hibernate.cache.StandardQueryCache

· 時間戳快取區域:org.hibernate.cache.UpdateTimestampCache

· 使用者自定義的查詢快取區域.

預設的查詢快取區域以及使用者自定義的查詢快取區域都用於存放查詢結果。而時間戳快取區域存放了對與查詢結果相關的表進行插入、更新或刪除操作的時間戳。Hibernate通過時間戳快取區域來判斷被快取的查詢結果是否過期。所以,當應用程式對資料庫的相關資料做了修改,Hibernate會自動重新整理快取的查詢結果。但是如果其他應用程式對資料庫的相關資料做了修改,則無法監測,此時必須由應用程式負責監測這一變化,然後手工重新整理查詢結果。Query介面的setForceCacheRefresh(true)

可以手工重新整理查詢結果。

在ehcache.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"

        /> 

2) 開啟查詢快取:在hibernate.cfg.xml新增如下配置,由於查詢快取查詢命中率比較低(Hibernate的自身機制造成),所以Hibernate的預設值是:關閉,所以在使用查詢快取時要開啟該快取。

<!--啟用查詢快取 -->

<property name="cache.use_query_cache">true</property> 

3)在程式中使用:

雖然按以上設定好了查詢快取,但Hibernate在執行查詢語句語句時仍不會啟用查詢快取。對於希望啟用查詢快取的查詢語句,應該呼叫Query介面的setCacheeable(true)方法:

測試類如下: 

/**

 *  演示查詢快取

 */

public void queryCache()

{

// 建立Session物件

Session session = sf.openSession();

// 建立HQL語句

String hql = "from PetInfo";

// 執行查詢

Query query = session.createQuery(hql);

// 啟用查詢快取

query.setCacheable(true);

// 使用自定義的查詢快取區域,若不設定,則使用標準查詢快取區域

query.setCacheRegion("myCacheRegion");

// 將查詢結果賦給List物件

List<PetInfo> petList = query.list();

// 迴圈列印查詢結果

for (int i=0;i<petList.size();i++)

{

// 迴圈得到PetInfo物件

PetInfo petInfo = petList.get(i);

System.out.println(petInfo.getPname());

}

// 關閉Session物件

session.close();

}

相關推薦

JDK1.8 Integer,Long等的快取策略

1 public class IntegerTest { 2 public static void main(String[] args) { 3 Integer a = 10; 4 Integer b = 10; 5 System.ou

magento快取系列詳解:實施正確的快取策略及不同快取結構分析

本篇文章主要介紹一下在maegnto裡cache(File System, APC, Memcached, Redis)的使用,及在不同的伺服器環境中改怎麼使用讓其效能達到最佳。 理解magento的Two-Level Caching magento預設使用zend framework的

Android中的快取策略

快取策略的主要流程: 當程式第一次從網路載入圖片後,將其快取到儲存裝置上,下一次就不用再次從網路上獲取了。為了提高應用的使用者體驗,往往還會再記憶體中再快取一份,這樣當應用打算從網路請求一張圖片時,首先從記憶體中讀取,如果沒有那就從儲存裝置中獲取,如果儲存裝置也沒有,那就從網路上下載

配置ehCache快取策略@Cacheable,@CacheEvict,@CachePut

ehCache ehcache.xml解析 <defaultCache maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSe

iOS快取策略之NSCache的簡單使用

NSCache是一個繼承NSObjec的可變集合,是蘋果提供的一套快取機制,用鍵值(key-value)對來臨時儲存只需要短暫儲存在記憶體中的資料,並且當記憶體空間很少的時候會可以自動釋放一些資源。 概觀 快取(cache)物件和其他可變集合不同的幾個方面。 NSCache類包含了各種自動銷燬

OkHttp3.0解析——談談內部的快取策略

前言 合理的利用本地的快取策略,可以有效的減少網路請求時候的網路開銷,減少響應的延遲。而在OkHttp3.0中的快取主要作用在快取攔截器CacheInterceptor裡面。所以現在我們就具體分析下CacheInterceptor中對快取的具體操作。 CacheInterceptor 我們都知道,OkH

Android快取策略與圖片載入

Android快取策略 Android快取策略 LruCache DiskLruCache glide 鏈式呼叫 配合生命週期使用 快取設定 fresco 新增依賴

Retrofit+okhttp+rxjava, 快取策略使用

主要涉及幾個要點:  要使用離線快取的頁面網路請求方式必須要用GET(POST不可以),其他不要的頁面還是用POST 在新增攔截器時,需要新增網路攔截器( .addNetworkInterceptor(new NetInterceptor()) //有網情況下,一分鐘內每次

AFNetworking和YTKNetwork的快取策略

Untold numbers of developers have hacked together an awkward, fragile system for network caching functionality, all because they weren’t aware that NSUR

npm 和 yarn 快取策略對比

npm 快取命令 npm cache 提供了三個命令,分別是npm cache add, npm cache clean, npm cache verify。 npm cache add 官方解釋說這個命令主要是 npm 內部使用,但是也可以用來手動給一個指定的 package

Integer類的快取策略

先給出一個問題,下面程式的輸出結果是什麼 public static void integerCacheTest{ Integer num_01 = 100; Integer num_02 = 100; S

Nginx靜態資源快取策略配置

1. 問題-背景 以前也經常用nginx,但用的不深,通常是簡單的設定個location用來做反向代理。直到今天給客戶做專案碰到快取問題:客戶有個app,只是用原生做了個殼,裡面的內容都是用h5寫的,我們半途接手將新版本靜態資源部署到伺服器上後,發現手機端一直顯示老的頁

Hibernate資料快取策略筆記02

  持久層設計中,往往需要考慮到幾個不同層次中的資料快取策略。這些層次的劃分標準針對不同的情況有所差異,一般而言,orm的資料快取應包含如下幾個層次: 1.事務級快取(Transaction Layer Cache) 2.應用級/程序級快取(Application/Pro

mybatis 使用快取策略

mybatis中預設開啟快取   1、mybatis中,預設是開啟快取的,快取的是一個statement物件。     不同情況下是否會使用快取   同一個SqlSession物件,重複呼叫同一個id的<select>(id必須相同)的時候,快取才會生效,兩者缺一不可

資料快取策略 快取淘汰算法系列

一、前言   快取演算法歷史已經很久了,但在樓主查詢相關資料時,發現知識零碎,且原理介紹的很不詳細,遂有了總結常用快取演算法文章的想法,以供廣大朋友們查閱。本文是快取系列的第一篇,知識側重於初略的介紹,並未深入。 二、NRU(Not recently used)  

SPRING CACHE REDIS 註解式實現快取策略

為了解決資料庫查詢效率瓶頸,提升併發系統能力,快取的應用已經非常普遍和必要了。剛接觸REDIS時,如何使SPRING框架與REDIS更高效地整合,困擾了我很長時間。 先說下不使用SPRING CACHE時的兩種快取應用模式: 1.使用redis作為持久層的二級快

MyBatis快取策略之二級快取

// 建立代理物件 UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class); // 第一次發起請求,查詢id為1的使用者 User user1 = userMapper1.findUserById(1)

RxJava2.0在安卓中的二級快取策略

前言 在上一篇 安卓網路資料快取策略 中,介紹了安卓中資料的快取策略,這篇將用RxJava2.0 實現 Json/Xml 資料的二級快取。 對於 RxJava2.0 不瞭解的,可以看一下這篇入門教程 從零開始的RxJava2.0教程1-4 。 彷彿有一

Hibernate的快取策略

繼上篇部落格中hibernate快取,我們繼續說 查詢快取。 三、查詢快取 查詢快取,顧明思議它是查詢的時候產生的緩衝,那麼就要問了,剛剛在一級快取,二級快取中的load,get不一樣是查詢嗎?那是什麼樣的查詢呢? 查詢快取是針對普通屬性結果集的快取,對實

HTTP快取策略學習總結

所有的快取都是基於一套規則來幫助他們決定什麼時候使用快取中的副本提供服務(假設有副本可用的情況下,未被銷燬回收或者未被刪除修改)。這些規則有的在協議中有定義(如HTTP1.0和HTTP1.1),有的則是由快取的管理員設定(如DBA、瀏覽器的使用者、代理伺服器管理