根據作用域和生命週期分為兩種:
一級快取: 同一執行緒(sqlsession)間共享快取,sqlsession一旦關閉,快取將不復存在。
一級快取只要用就有,一直處於開啟狀態。
二級快取: 不同執行緒間共享快取(不同sqlsession 同乙個namespace ),與整個應用生命週期是一致的
按照namespace劃分,不同的互不干擾
證明一級快取是存在的
student student = dao.selectstudentbyid(2);
system.out.println(student);
student student2 = dao.selectstudentbyid(2);
system.out.println(student2);
執行結果:只進行了一次查詢,證明一級快取是存在的
mybatis:證明一級快取中讀取資料的依據是sql id + sql語句
hibernate:快取中讀取資料的依據是查詢結果物件id
orm架構不同,查詢依據不同
查詢依據肯定不是物件id
查詢依據其實是sql id和sql語句,快取底層結構是個map,value是物件id(查詢結果),key是sql id和其對應的sql語句。
增刪改操作會重新整理一級快取(清空一級快取)
無論是否提交
使用二級快取的目的不是在多個查詢中共享查詢結果。而是為了防止同一查詢(同sql id 同sql語句)的反覆執行。
證明二級快取是存在的
//證明二級快取是存在的
@test
public void test01()
① 對實體進行序列化,② 在對映檔案中新增cache標籤
cache hit ratio 為命中率
增刪改對二級快取的影響
1.增刪改同樣會清空二級快取
2.二級快取的清空不是把對都乾掉,而是將key對應的value置為null,key仍然存在。
3.從db中進行select查詢的條件是:
① 快取中根本就不存在這個key
② 快取中存在key所對應的entry物件,但是value為null
但不能對一級快取進行配置
二級快取的關閉
select id,name,age,score
from student
where id = #
二級快取的使用原則① 多個namespace不操作同一張表
② 不要再關聯關係表中做增刪改操作
③ 查詢多於修改時使用二級快取
MyBatis查詢快取
一級快取 同乙個sqlsession物件,mybatis預設開啟一級快取。如果用同樣的sqlsession物件查詢相同的資料,則只會在第一次查詢時向資料庫傳送sql語句,並將查詢結果放入到sqlsession中 作為快取存在 後續再次查詢該同樣的物件時,則直接從快取中查詢該物件即可 即省略了資料庫的...
mybatis 多次查詢快取的問題
size medium 最近在使用mybatis的過程中,發現乙個問題。如果在同乙個事物中,多次同乙個查詢sql在mybatis的執行過程中,只會查詢一次資料庫,後幾次所返回的物件是mybatis在在內部做了快取。size property property this.findbypropertyi...
Mybatis延遲載入和查詢快取
在全域性配置引數設定開啟延遲載入總開關 name lazyloadingenabled value true name aggressivelazyloading value false settings 設定項 描述允許值 預設值lazyloadingenabled 全域性性設定懶載入。如果設為 ...