MyBatis:MyBatis一二級(jí)緩存,你學(xué)會(huì)了嗎?
一、一級(jí)緩存
1、在?個(gè)sqlSession中,對(duì)User表根據(jù)id進(jìn)行兩次查詢,查看他們發(fā)出sql語(yǔ)句的情況。
2、同樣是對(duì)user表進(jìn)?兩次查詢,只不過(guò)兩次查詢之間進(jìn)?了?次update操作。
3、總結(jié)
(1)第?次發(fā)起查詢?戶id為1的?戶信息,先去找緩存中是否有id為1的?戶信息,如果沒(méi)有,從數(shù)據(jù)庫(kù)查詢?戶信息。得到?戶信息,將?戶信息存儲(chǔ)到?級(jí)緩存中。
(2)如果中間sqlSession去執(zhí)?commit操作(執(zhí)?插?、更新、刪除),則會(huì)清空SqlSession中的?級(jí)緩存,這樣做的目的為了讓緩存中存儲(chǔ)的是最新的信息,避免臟讀。
(3)第?次發(fā)起查詢用戶id為1的?戶信息,先去找緩存中是否有id為1的?戶信息,緩存中有,直接從緩存中獲取用戶信息
二、?級(jí)緩存
?級(jí)緩存的原理和?級(jí)緩存原理一樣,第?次查詢,會(huì)將數(shù)據(jù)放?緩存中,然后第?次查詢則會(huì)直接去緩存中取。
但是?級(jí)緩存是基于sqlSession的,??級(jí)緩存是基于mapper?件的namespace的,也就
是說(shuō)多個(gè)sqlSession可以共享?個(gè)mapper中的?級(jí)緩存區(qū)域,并且如果兩個(gè)mapper的namespace相同,即使是兩個(gè)mapper,那么這兩個(gè)mapper中執(zhí)?sql查詢到的數(shù)據(jù)也將存在相同的?級(jí)緩存區(qū)域中。