Hibernate查詢快取全面分析

2021-08-27 22:49:18 字數 2037 閱讀 5566

這裡介紹hibernate查詢快取對iterator不起作用,只對list起作用。

快取分類:

◆一級快取 session級

◆二級快取 sessionfactory級別,jvm級別

◆hibernate查詢快取不固定(生命週期不固定)

生命週期:

◆一級快取 是和 session 會話一致產生一致消失

◆二級快取 是和 sessionfacotry 一致

◆hibernate查詢快取 生命週期不固定,當資料庫表發生改變,使用hibernate查詢快取馬上消失

使用方法:

◆一級快取:這個就不用說了

◆二級快取:首先拷貝使用hibernate查詢快取類別.xml到 classpath目錄下面,然後到hibernate.cfg.xml裡面配置。開啟二級快取(預設開啟),定義要使用二級快取的實體類,然後就是在程式中要顯示的指定session。使用二級快取的類別 有三種,normal,get,put預設使用的是 normal即可以寫也可以讀取二級快取(這裡讀寫是指的會話session)

◆hibernate查詢快取:首先也是到hibernate配置檔案中去開啟hibernate查詢快取,然後程式中也要顯示的呼叫方法來開啟hibernate查詢快取eg:query.setcachemodel(true);

快取的儲存物件:

◆一級快取:快取實體

◆二級快取:快取的也是實體

◆hibernate查詢快取快取的是查詢出來的實體的部分屬性結果集和實體的id(注意這裡不是實體)

快取的使用物件:

◆一級快取: 

load(lazy載入):首先查詢把序列號去和一級快取匹配是否有,有就直接取出來,如果沒有,則發出sql語句。

get:也使用一級快取。

list介面:query.list()不使用一級快取,每次都要發出sql eg:(select * from tudent)。

iterator介面: query.iterate();使用一級快取。首先是要發出一條sql來取得id,eg: select。id from student; 然後把id拿到快取中去匹配, 如果有,就直接取,如果沒有,就要再發出sql。如果都沒有,將發出n+1條sql,這就是n+1問題。

◆二級快取: 都使用了二級快取。

◆hibernate查詢快取:對list 和iterator介面起作用。但是hibernate查詢快取對iterator不起作用,只對list起作用。

下面我們這種介紹把二級快取和hibernate查詢快取結合使用。

當只是用hibernate查詢快取而關閉二級快取的時候:

第一:如果查詢的是部分屬性結果集: 那麼當第二次查詢的時候就不會發出sql,直接從hibernate查詢快取中取資料;

第二:如果查詢的是實體結果集eg(from student) ,首先hibernate查詢快取存放實體的id,第二次查詢的時候就到hibernate查詢快取中取出id 一條一條的到資料庫查詢,這樣,將發出n 條sql造成了sql氾濫。

當都開啟hibernate查詢快取和二級快取的時候:

第一:如果查詢的是部分屬性結果集: 這個和上面只是用hibernate查詢快取而關閉 二級快取的時候一致,因為不涉及實體不會用到二級快取;

第二:如果查詢的是實體結果集eg(from student),首先hibernate查詢快取存放實體的id,第二次查詢的時候,就到hibernate查詢快取中取出id,到二級快取區找資料,如果有資料,就不會發出sql;如果都有,一條sql都不會發出,直接從二級快取中取資料。

總結: 查詢快取的key與hql,查詢引數以及分布引數有關,而且一旦查詢涉及到的任何一張表的資料發生了變化,快取就失效了,所以在生產環境中命中率較低。查詢快取儲存的是結果集的id列表,而不是結果集本身,命中快取的時候,會根據id乙個乙個地先從二級快取查詢 ,找不到再查詢資料庫。

list()沒有使用快取中的實體物件,因為查詢需要查詢到所有符合條件的記錄,因此必須執行select sql,來保證查詢資料的完整性;而iterate()通過執行select sql語句來獲取滿足查詢條件的記錄的id,來保證查詢資料的完整性

hibernate查詢快取

自 查詢快取的生命週期,當查詢關聯的表發生改變,那麼查詢快取的生命週期結束 delete update modify 啟用查詢快取 1.hibernate.cfg.xml中配置 true 2.中用setcacheable true 手動啟用 只對list 方法起作用 預設情況下list 每次都會發s...

Hibernate的查詢快取

在hibernate的使用中,大家都很熟悉一級快取和二級快取的使用,在hibernate中還有另一種快取,查詢快取。查詢快取是依賴於二級快取的。一.查詢快取的執行方式 hibernate的查詢快取是主要是針對普通屬性結果集的快取,而對於實體物件的結果集只快取id。在一級快取,二級快取和查詢快取都開啟...

hibernate的查詢快取

在hibernate的使用中,大家多數時間都在討論一級快取和二級快取,而往往忽略了查詢快取。其實hibernate的查詢快取在使用過程中也起著同樣重要的作用。hibernate的查詢快取是主要是針對普通屬性結果集的快取,而對於實體物件的結果集只快取id。在一級快取,二級快取和查詢快取都開啟的情況下作...