Mybatis緩存機(jī)制詳解與實(shí)例分析
Mybatis緩存概述
Mybatis的緩存分為一級(jí)緩存和二級(jí)緩存。一級(jí)緩存是SqlSession級(jí)別的,主要用于減少同一個(gè)SqlSession中相同的查詢語(yǔ)句執(zhí)行的次數(shù);而二級(jí)緩存是mapper級(jí)別的,多個(gè)SqlSession可以共享一個(gè)UserMapper的二級(jí)緩存。
一級(jí)緩存
首先先詳細(xì)介紹一下一級(jí)緩存。
一級(jí)緩存是默認(rèn)開啟的,不需要我們開發(fā)者特別配置。當(dāng)使用SqlSession進(jìn)行查詢時(shí),如果下一次再使用相同的SqlSession進(jìn)行查詢,就會(huì)直接從緩存中取數(shù)據(jù),如果沒(méi)有才從數(shù)據(jù)庫(kù)中取數(shù)據(jù)。
那么一級(jí)緩存是如何失效的呢?
當(dāng)執(zhí)行增刪改操作(insert、update、delete)時(shí),會(huì)清空一級(jí)緩存,因?yàn)樵鰟h改操作可能會(huì)改變數(shù)據(jù)庫(kù)中的數(shù)據(jù),為了保證數(shù)據(jù)的一致性,需要清空緩存
。
二級(jí)緩存
接著我們學(xué)習(xí)一下二級(jí)緩存。
二級(jí)緩存需要我們手動(dòng)開啟和配置。在mapper.xml文件中添加標(biāo)簽,就可以開啟二級(jí)緩存。對(duì)于使用注解的mapper,我們?cè)诮涌谏鲜褂聾CacheNamespace注解也可以啟用二級(jí)緩存。
那么二級(jí)緩存共享可以共享嗎?
二級(jí)緩存是mapper級(jí)別的,多個(gè)SqlSession是可以共享同一個(gè)mapper的二級(jí)緩存。這樣可以減少跨SqlSession中相同的查詢語(yǔ)句執(zhí)行的次數(shù),進(jìn)一步提高性能。
緩存實(shí)例分析
接下來(lái)我們通過(guò)一個(gè)之前課設(shè)的例子來(lái)深入理解Mybatis的緩存機(jī)制。
首先,我們需要?jiǎng)?chuàng)建一個(gè)實(shí)體類User,如下:
public class User { private int id; private String name; private String email; // 此處省略了getter和setter方法 }
接著,我們需要?jiǎng)?chuàng)建一個(gè)UserMapper接口,如下:
public interface UserMapper { List<User> selectUsers(); // 默認(rèn)返回全部用戶信息 }
然后在對(duì)應(yīng)的MyBatis配置文件中添加一個(gè)使用一級(jí)緩存的SQL語(yǔ)句:
<select id="selectUsers" resultType="com.example.demo.model.User"> SELECT * FROM users WHERE is_delete=0 </select>
然后在Mapper接口中使用該SQL語(yǔ)句,并且在調(diào)用方法前面添加一行代碼,用來(lái)開啟一級(jí)緩存:
public class UserService { @Cacheable("userList") // 使用一級(jí)緩存的示例,執(zhí)行完畢后自動(dòng)清除數(shù)據(jù)到二級(jí)緩存中。若不需要將結(jié)果存儲(chǔ)到二級(jí)緩存中,可以在@Cacheable注解中添加key屬性為null即可。例如:@Cacheable(key = "userList") public List<User> selectUsers() { return userMapper.selectUsers(); // 默認(rèn)返回全部用戶信息 } }
我們這個(gè)例子介紹了如何使用一級(jí)緩存。二級(jí)緩存的使用相對(duì)復(fù)雜一些,需要考慮更多的問(wèn)題和情況。同時(shí)也要注意一些細(xì)節(jié)問(wèn)題,比如當(dāng)一個(gè)Mapper有多個(gè)SqlStatement時(shí),默認(rèn)只有一個(gè)被應(yīng)用到二級(jí)緩存中,如果有多個(gè)需要執(zhí)行相同Sql語(yǔ)句的情況(比如對(duì)多個(gè)不同的結(jié)果集進(jìn)行合并),需要手動(dòng)配置多個(gè)不同的SqlStatement對(duì)應(yīng)不同的二級(jí)緩存名稱。
同時(shí)我們也要注意數(shù)據(jù)一致性問(wèn)題,避免在多個(gè)SqlSession之間產(chǎn)生沖突。
注意事項(xiàng)
除了上面所說(shuō)的之外,還需要注意這些問(wèn)題:
- 臟讀問(wèn)題:由于緩存的存在,可能會(huì)導(dǎo)致臟讀問(wèn)題。即當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)已經(jīng)改變,但緩存中的數(shù)據(jù)還未更新時(shí),讀取到的將是舊的數(shù)據(jù)。因此,在使用緩存時(shí),需要注意數(shù)據(jù)的實(shí)時(shí)性和一致性。
- 緩存策略選擇:一級(jí)緩存和二級(jí)緩存各有優(yōu)缺點(diǎn),需要根據(jù)我們的實(shí)際應(yīng)用場(chǎng)景和需求進(jìn)行選擇。對(duì)于讀多寫少的應(yīng)用,可以更多地使用二級(jí)緩存;對(duì)于讀寫都比較頻繁的應(yīng)用,可能需要慎用緩存,避免數(shù)據(jù)的不一致性。
到此這篇關(guān)于Mybatis緩存機(jī)制詳解與實(shí)例分析的文章就介紹到這了,更多相關(guān)Mybatis緩存機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)的滿天星效果實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)滿天星效果的方法,涉及Java繪圖的應(yīng)用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11解決rocketmq-client日志保存路徑的問(wèn)題
這篇文章主要介紹了解決rocketmq-client日志保存路徑的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07java實(shí)現(xiàn)二維碼生成功能詳細(xì)示例
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)二維碼生成功能的相關(guān)資料,隨著信息化時(shí)代的到來(lái),二維碼作為一種信息傳遞的工具,越來(lái)越受到人們的歡迎,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07IDEA版使用Java操作Redis數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了IDEA版使用Java操作Redis數(shù)據(jù)庫(kù)的方法,首先需要下載jedis.jar包,然后再工程中設(shè)置具體操作步驟跟隨小編一起學(xué)習(xí)下吧2021-08-08java后臺(tái)實(shí)現(xiàn)js關(guān)閉本頁(yè)面,父頁(yè)面指定跳轉(zhuǎn)或刷新操作
這篇文章主要介紹了java后臺(tái)實(shí)現(xiàn)js關(guān)閉本頁(yè)面,父頁(yè)面指定跳轉(zhuǎn)或刷新操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id
這篇文章主要介紹了如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Apache?Commons?Config管理配置文件核心功能使用
這篇文章主要為大家介紹了Apache?Commons?Config管理和使用配置文件核心深入探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Java實(shí)現(xiàn)上傳文件到服務(wù)器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)上傳文件到服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04