1. 什么是一級(jí)緩存?

一級(jí)緩存是 MyBatis 默認(rèn)開(kāi)啟的緩存機(jī)制。它位于 SqlSession 的內(nèi)部,用于緩存查詢結(jié)果。當(dāng)我們執(zhí)行相同的 SQL 語(yǔ)句時(shí),MyBatis 會(huì)先查找一級(jí)緩存,如果緩存中存在對(duì)應(yīng)的結(jié)果,則直接返回,而不再訪問(wèn)數(shù)據(jù)庫(kù)。

2. 一級(jí)緩存的生命周期

一級(jí)緩存的生命周期與 SqlSession 相關(guān)聯(lián)。當(dāng)我們創(chuàng)建一個(gè) SqlSession 對(duì)象時(shí),一級(jí)緩存被創(chuàng)建;當(dāng)我們關(guān)閉 SqlSession 對(duì)象時(shí),一級(jí)緩存被清空。這意味著一級(jí)緩存只在一個(gè) SqlSession 的范圍內(nèi)有效。

3. 一級(jí)緩存的特性

一級(jí)緩存具有以下特性:

默認(rèn)開(kāi)啟,無(wú)需配置

基于對(duì)象引用,存儲(chǔ)在內(nèi)存中

對(duì)于相同的查詢語(yǔ)句,結(jié)果會(huì)被緩存下來(lái)

一級(jí)緩存是事務(wù)性的,只在事務(wù)提交或回滾后才會(huì)生效

4. 一級(jí)緩存的使用場(chǎng)景

一級(jí)緩存適用于以下場(chǎng)景:

頻繁讀取相同數(shù)據(jù)

數(shù)據(jù)不經(jīng)常更新

查詢結(jié)果數(shù)量不大

5. 一級(jí)緩存的失效情況

一級(jí)緩存會(huì)在以下情況下失效:

執(zhí)行了增刪改操作,可能會(huì)改變緩存中的數(shù)據(jù)

手動(dòng)清空緩存,通過(guò)調(diào)用 SqlSession 的 clearCache 方法

SqlSession 被關(guān)閉,導(dǎo)致緩存被清空

6. 控制一級(jí)緩存的行為

MyBatis 提供了一些配置選項(xiàng),可以控制一級(jí)緩存的行為:

設(shè)置緩存級(jí)別為 STATEMENT,每次查詢都會(huì)刷新緩存

關(guān)閉緩存,通過(guò)在 <select>、<insert><update>、<delete> 標(biāo)簽上添加 flushCache="true" 屬性

手動(dòng)清空緩存,通過(guò)調(diào)用 SqlSession 的 clearCache 方法

7. 總結(jié)

MyBatis 的一級(jí)緩存是一種輕量級(jí)的緩存機(jī)制,能夠顯著提升查詢性能。它的生命周期與 SqlSession 相關(guān)聯(lián),具有一定的使用場(chǎng)景和失效情況。通過(guò)合理配置,我們可以控制一級(jí)緩存的行為,以適應(yīng)不同的業(yè)務(wù)需求。