1. 程式人生 > >說說自己對hibernate一級、二級、查詢、快取的理解。

說說自己對hibernate一級、二級、查詢、快取的理解。

今天面試碰到答不上來。。馬上回家查了下,現在寫下對hibernate快取的理解以加深印象。

1、一級快取

可以簡單的理解為session快取,即同一個session中使用get、load、迭代,會優先重快取中取,如果沒有則查詢資料庫並存入快取,session關閉後快取清空

2、二級快取

可以直接理解為升級版,即sessionFactory 快取,即只要使用的session是同一個sessionFactory建立的則可共用快取,並且修改、刪除、新增、會更新快取。

3、查詢快取

也就是三級快取(說三級快取的很坑),我的理解就是query快取,使用query.setCacheable(true) 即可開啟查詢快取,查詢快取只快取普通屬性結果集,不快取整個實體類結果集,以及實體類ID結果集,

查詢快取是針對普通屬性結果集的快取對實體物件的結果集只快取id,查詢快取在查詢實體類時會首先到查詢快取中查詢ID然後根據ID到一級或者二級快取中查詢實體類,沒有則從資料庫取,查詢普通屬性時也是優先從快取中取。

  關閉二級快取,開啟查詢快取,呼叫query.list()會發出N條語句,因為查詢快取是根據ID到二級快取中找的,沒有則查詢資料庫,二級快取和查詢快取同時開啟則查詢同樣SQL語句時不會發出資料庫請求,而是直接從快取中取。

備註:

查詢快取只會query.list()起作用.

session.find方法永遠是從資料庫中獲取資料

快取通過map 使用ID作為KEY來快取物件、一級和二級快取只快取物件