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