MyBatis的一級(jí)緩存:什么是它,為什么要使用?
一級(jí)緩存是MyBatis中非常有用的一個(gè)特性,它可以提高數(shù)據(jù)庫(kù)的查詢(xún)性能。在操作數(shù)據(jù)庫(kù)時(shí),我們需要構(gòu)造SqlSession對(duì)象,并在其中使用一個(gè)內(nèi)存區(qū)域(HashMap)用于存儲(chǔ)緩存數(shù)據(jù)。當(dāng)我們執(zhí)行查
一級(jí)緩存是MyBatis中非常有用的一個(gè)特性,它可以提高數(shù)據(jù)庫(kù)的查詢(xún)性能。在操作數(shù)據(jù)庫(kù)時(shí),我們需要構(gòu)造SqlSession對(duì)象,并在其中使用一個(gè)內(nèi)存區(qū)域(HashMap)用于存儲(chǔ)緩存數(shù)據(jù)。當(dāng)我們執(zhí)行查詢(xún)語(yǔ)句時(shí),會(huì)將查詢(xún)結(jié)果緩存到這個(gè)map中。如果下次再查詢(xún)時(shí),會(huì)先判斷之前是否有完全相同的查詢(xún),如果有,則直接從緩存中讀取,這就是一級(jí)緩存的作用。
需要注意的是,如果在第一次查詢(xún)后,對(duì)數(shù)據(jù)進(jìn)行了增刪改,則該map緩存就會(huì)被清空,避免下次查詢(xún)時(shí)出現(xiàn)臟讀(即數(shù)據(jù)被改變,但你從緩存中讀取的數(shù)據(jù)不對(duì))。
舉個(gè)例子來(lái)演示一下,首先我們查詢(xún)id為1的用戶(hù),然后再一次讀取,看看是否使用到了一級(jí)緩存:
首先我們進(jìn)入debug來(lái)執(zhí)行第一個(gè)查詢(xún),可以看到控制臺(tái)的日志中顯示了查詢(xún)語(yǔ)句,表明這次是查詢(xún)數(shù)據(jù)庫(kù)來(lái)得到數(shù)據(jù)并將其存入緩存中。
然后看看第二次查詢(xún)相同的數(shù)據(jù),可以看到?jīng)]有再出現(xiàn)查詢(xún)語(yǔ)句,但是得到的數(shù)據(jù)是正確的,表明這次數(shù)據(jù)是從一級(jí)緩存中取的。這樣就可以不用頻繁地訪問(wèn)數(shù)據(jù)庫(kù)了。
但是,如果在第一個(gè)查詢(xún)后,修改了數(shù)據(jù)(此時(shí)會(huì)清空緩存),那么第二次查詢(xún)就需要再次訪問(wèn)數(shù)據(jù)庫(kù)了,下圖兩個(gè)查詢(xún)sql都出現(xiàn)了,可以看出調(diào)用了兩次數(shù)據(jù)庫(kù):
實(shí)際上,我們可以發(fā)現(xiàn),SqlSession這個(gè)會(huì)話(huà)非常重要,如果會(huì)話(huà)關(guān)閉了(緩存被清空了),那就什么都沒(méi)了。同樣的,如果我們開(kāi)啟了兩個(gè)會(huì)話(huà):會(huì)話(huà)1、會(huì)話(huà)2,會(huì)話(huà)1剛查詢(xún)完數(shù)據(jù),會(huì)話(huà)2剛好對(duì)這個(gè)數(shù)據(jù)進(jìn)行修改(此時(shí)數(shù)據(jù)庫(kù)的數(shù)據(jù)),那么會(huì)話(huà)1再查詢(xún)的時(shí)候是從自己會(huì)話(huà)對(duì)象的緩存中取的數(shù)據(jù),這時(shí)的數(shù)據(jù)就和數(shù)據(jù)庫(kù)的數(shù)據(jù)不同了(剛才會(huì)話(huà)2修改過(guò))。
因此,當(dāng)使用一級(jí)緩存時(shí),需要確保在同一個(gè)SqlSession中使用。否則,使用的就不是一級(jí)緩存了。如果要跨SqlSession使用,則需要使用二級(jí)緩存(下次介紹),這點(diǎn)需要注意。
以上就是關(guān)于MyBatis的一級(jí)緩存的介紹和使用方法。如果本文對(duì)您有幫助,請(qǐng)為我們的文章點(diǎn)贊投票。我們的文章均基于平時(shí)在項(xiàng)目中遇到的問(wèn)題積累和總結(jié)而來(lái),謝謝閱讀。