hibernate中的三級快取與載入
首先說JCS;
JCS:指的是java cache system
JCS中是依據物件中的唯一標示進行儲存 儲存結構為map結構
為什麼要說JCS呢,因為hibernate的快取二級快取與JCS密切相關,
1.什麼是三級快取呢?
一級快取:指的是Session快取,基於執行緒的快取
二級快取 指的是SessionFactory的快取,是基於程序的快取 (由於SessionFactory的宣告週期和程式的宣告週期是相同的,並且是單例的)
二級快取又分為內建快取和外接快取
內建快取是hibernate中自己編寫的
外接快取是hibernate藉助第三方外掛的快取
外接快取又分為class快取和查詢快取
這兩種快取都採用的是map結構,前者的key儲存的是sql語句的字串,value儲存的是主鍵id的集合
後者的key儲存的是id,value儲存的是id所對應的某一條記錄封裝後的物件
三級快取 :指的是外接快取中的查詢快取
由於查詢快取依賴於class快取,所以說三級快取是基於二級快取之上的.
好吧,講了這麼多,快取相信也講的很明瞭了吧,接下來說說資料的載入吧,資料的載入與快取有關係的,所以先講述了三級快取機制
載入機制分為兩類:
一,即時載入 ,
list方法:傳送sql語句,將會返回所有相關的資料,並進行快取
get方法,利用物件的id,然後去一級快取中找,如果有返回,否則去二級快取中找,如果有返回,否則直接去資料庫查詢
二. 延時載入(在hibernate中也成為懶載入)
iterator方法傳送sql語句,將會返回所記錄的id集合,如果需要檢視相應的屬性值,則回去二級快取的class快取中根據id進行查詢,如果沒有, 才會去資料庫中根據id查詢
load方法 利用物件的id,然後去一級快取中找,如果有則返回,如果沒有,則不再去二級快取中尋找,預設有,會返回物件的代理物件,如果查 看物件屬性的的話,才去二級快取查詢,如果沒有再去根據id進行資料庫訪問