一級快取基於sqlsession,是預設開啟的,在運算元據庫時需要構造sqlsession物件,在物件中有乙個hashmap用於儲存快取資料。不同的sqlsession之間快取資料區域是互相不影響的。
一級快取的作用域是sqlsession範圍的,當在同乙個sqlsession中執行兩次相同的sql語句時,第一次執行完畢會將資料庫中查詢的資料寫到快取中。
第二次查詢時會從快取中獲取資料,不再去底層資料庫查詢,從而提高查詢效率。
但如果sqlsession執行了dml操作(增刪改),並且提交到資料庫,mybatis則會清空sqlsession中的一級快取,這樣做的目的時為了保證快取中儲存的是最新的資訊,避免出現髒讀。
當乙個sqlsession結束後該sqlsession中的第一快取也就不存在了。
1
sqlsession1中
select username from
user
where id = ?
id =
1 得到username = 小明 ,這個結果會快取到sqlsession1中
這時再次執行 select username from
user
where id =1,
這個查詢就直接從sqlsession1的快取中得到結果,不去查詢資料庫了。 結果是username = 小明
2sqlsession1中 執行update
delete
insert時 sqlsession1中的快取會失效(清空)
insert
into
user
values(.
..)update
user
setwhere..
.這時再次執行select username from
user
where id = ?,這次查詢會走資料庫
3sqlsession2中 執行update
delete
insert時 對sqlsession1中的快取沒有影響
比如在sqlsession中執行
update
user
set username =
'小白'
where id =
1這時sqlsession1中執行 select username from
user
where id =
1,查詢走快取,得到結果為 小明 出現髒讀。
1;;
system.
out.println(1)
);sqlsession1.
commit()
; system.
out.println(1)
);只有當sqlsession1 commit
() 之後, sqlsession2才能查詢命中快取
2,有sqlsession 進行了delete、insert、update操作是否會重新整理該namespace下的二級快取(清空,使失效)
3,mybatis的二級快取不適應用於對映檔案中存在多表查詢的情況
通常我們會為每個單錶建立單獨的對映檔案,
select
s.id,
s.name,
s.age,
class.name as classname
from
classroom c
join student s on c.student_id = s.id
join class on c.class_id = class .id
where
s.id =1;
;;;system.
out.println(1)
);sqlsession1.
close()
;// 命中二級快取
system.
out.println(1)
);"特色一班",1
);sqlsession3.
commit()
;system.
out.println(1)
);
mybatiss的二級快取在多表查詢時,極大可能會出現髒資料分布式環境下,由於預設的mybatis cache實現都是基於本地的,分布式環境下必然會出現讀取到髒資料建議mybatis快取特性在生產環境中進行關閉,如需要快取,使用redis等分布式快取。 mybatis快取 一級快取,二級快取
什麼是快取 為什麼使用快取 適用於快取的資料 二級快取的使用步驟 在主配置檔案配置 name cacheenabled value ture 讓當前的操作支援快取 在對映檔案中 select 標籤中配置 在select標籤中 新增乙個屬性 userscache true 先建立出乙個sqlsessi...
Mybatis快取(一級快取 二級快取)
mybatis快取分為一級快取 二級快取。mybatis一級快取預設是開啟的 二級快取全域性開關預設也是開啟的,但需要配置cachenamespace才可生效!以mybatis plus為例 mybatis plus configuration log impl org.apache.ibatis....
Mybatis 一級快取 二級快取
快取分類 一級快取 事務範圍 快取只能被當前事務訪問。快取的生命週期 依賴於事務的生命週期當事務結束時,快取也就結束生命週期。在此範圍下,快取的介質是記憶體。二級快取 程序範圍 快取被程序內的所有事務共享。這些事務有 可能是併發訪問快取,因此必須對快取採取必要的事務隔離機制。快取的生命週期依賴於程序...