MyBatis 第4章 查詢快取

2021-08-28 08:14:50 字數 2366 閱讀 8287

根據作用域和生命週期分為兩種:

一級快取: 同一執行緒(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 全域性性設定懶載入。如果設為 ...