MyBatis是一種輕量級(jí)的持久化框架,它提供了一級(jí)緩存和二級(jí)緩存的機(jī)制來優(yōu)化數(shù)據(jù)庫(kù)操作性能。一級(jí)緩存是默認(rèn)開啟的,而二級(jí)緩存需要手動(dòng)配置啟用。
一、一級(jí)緩存
1.1 緩存生命周期
一級(jí)緩存存在于SqlSession的生命周期中,當(dāng)SqlSession關(guān)閉時(shí),一級(jí)緩存也會(huì)被清空。
1.2 緩存實(shí)現(xiàn)機(jī)制
一級(jí)緩存采用了基于PerpetualCache的HashMap來實(shí)現(xiàn),使用一個(gè)Map對(duì)象來保存緩存的數(shù)據(jù)。當(dāng)執(zhí)行相同的查詢時(shí),MyBatis會(huì)首先尋找一級(jí)緩存中是否存在對(duì)應(yīng)的緩存數(shù)據(jù),如果存在則直接返回,否則通過數(shù)據(jù)庫(kù)查詢獲取數(shù)據(jù)并放入緩存中。
1.3 緩存命中條件
緩存的命中條件比較嚴(yán)格,需要滿足以下條件:
同一個(gè)SqlSession。
相同的查詢語(yǔ)句。
參數(shù)也要相同。
如果其中有一個(gè)條件不滿足,將會(huì)導(dǎo)致緩存失效。
1.4 緩存清空
一級(jí)緩存有以下幾種清空方式:
通過調(diào)用SqlSession的clearCache()方法手動(dòng)清空緩存。
執(zhí)行任何的數(shù)據(jù)更新操作(insert、update、delete),會(huì)自動(dòng)清空緩存。
二、二級(jí)緩存
2.1 緩存生命周期
二級(jí)緩存的生命周期和SqlSessionFactory相同,當(dāng)應(yīng)用程序關(guān)閉時(shí),二級(jí)緩存也會(huì)被銷毀。
2.2 緩存實(shí)現(xiàn)機(jī)制
二級(jí)緩存也采用了基于PerpetualCache的HashMap來實(shí)現(xiàn),但是它是一個(gè)全局的緩存,多個(gè)SqlSession之間可以共享這個(gè)緩存。
2.3 緩存命中條件
二級(jí)緩存的命中條件與一級(jí)緩存相同。
2.4 緩存清空
二級(jí)緩存的清空需要手動(dòng)配置。在映射文件(Mapper)中的標(biāo)簽內(nèi)設(shè)置flushCache="true"
,可以在執(zhí)行任何的數(shù)據(jù)更新操作后自動(dòng)清空二級(jí)緩存。
2.5 配置二級(jí)緩存
在MyBatis的配置文件中配置二級(jí)緩存,需要在標(biāo)簽內(nèi)添加以下配置:
并在映射文件(Mapper)中的標(biāo)簽內(nèi)進(jìn)行更多的配置。
三、一級(jí)緩存和二級(jí)緩存的比較和使用場(chǎng)景
3.1 一級(jí)緩存的優(yōu)勢(shì)和劣勢(shì)
優(yōu)勢(shì):
一級(jí)緩存是默認(rèn)啟用的,使用起來非常方便。
一級(jí)緩存存儲(chǔ)在SqlSession內(nèi)部,讀寫速度非???。
劣勢(shì):
一級(jí)緩存只能在同一個(gè)SqlSession中共享,無(wú)法在多個(gè)SqlSession之間共享。
一級(jí)緩存的生命周期比較短,當(dāng)SqlSession關(guān)閉時(shí)緩存也會(huì)被清空。
3.2 二級(jí)緩存的優(yōu)勢(shì)和劣勢(shì)
優(yōu)勢(shì):
二級(jí)緩存是全局的,多個(gè)SqlSession之間可以共享。
二級(jí)緩存的生命周期和應(yīng)用程序相同。
劣勢(shì):
需要手動(dòng)配置和啟用二級(jí)緩存。
二級(jí)緩存的讀寫速度相對(duì)于一級(jí)緩存要慢一些。
3.3 使用場(chǎng)景
一級(jí)緩存適用于以下情況:
數(shù)據(jù)庫(kù)查詢操作多且頻繁。
數(shù)據(jù)更新操作少且不頻繁。
數(shù)據(jù)庫(kù)查詢結(jié)果經(jīng)常被重復(fù)使用。
二級(jí)緩存適用于以下情況:
多個(gè)SqlSession之間需要共享緩存數(shù)據(jù)。
數(shù)據(jù)更新操作較少。
總結(jié):
MyBatis的一級(jí)緩存和二級(jí)緩存主要是為了提高數(shù)據(jù)庫(kù)操作性能而設(shè)計(jì)的兩個(gè)機(jī)制。一級(jí)緩存是默認(rèn)開啟的,在SqlSession的生命周期內(nèi)有效,使用方便但局限性較大。二級(jí)緩存需要手動(dòng)配置啟用,為全局緩存,多個(gè)SqlSession之間可以共享數(shù)據(jù),使用較為靈活。根據(jù)具體的應(yīng)用場(chǎng)景和需求,可以靈活選擇合適的緩存策略來提高應(yīng)用的性能。
-
緩存
+關(guān)注
關(guān)注
1文章
239瀏覽量
26671 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3794瀏覽量
64362 -
MAP
+關(guān)注
關(guān)注
0文章
49瀏覽量
15137 -
mybatis
+關(guān)注
關(guān)注
0文章
60瀏覽量
6709
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論