Mybatis 緩存原理及失效情況解析
這篇文章主要介紹了Mybatis 緩存原理及失效情況解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
1、什么是緩存[Cache]
- 存在內(nèi)存中的臨時(shí)數(shù)據(jù)。
- 將用戶(hù)經(jīng)常查詢(xún)的數(shù)據(jù)放在緩存(內(nèi)存)中,用戶(hù)去查詢(xún)數(shù)據(jù)就不用從磁盤(pán)上(關(guān)系型數(shù)據(jù)庫(kù)數(shù)據(jù)文件)查詢(xún),從緩存中查詢(xún),從而提高查詢(xún)效率,解決了高并發(fā)系統(tǒng)的性能問(wèn)題。
2、為什么要使用緩存
減少和數(shù)據(jù)庫(kù)的交互次數(shù),減少系統(tǒng)開(kāi)銷(xiāo),提高系統(tǒng)效率。
3、什么樣的數(shù)據(jù)需要使用緩存
經(jīng)常查詢(xún)且不易改變的數(shù)據(jù)
4、Mybatis緩存
- MyBatis包含一個(gè)非常強(qiáng)大的查詢(xún)緩存特性,它可以非常方便地定制和配置緩存。緩存可以極大的提升查詢(xún)效率。
- MyBatis系統(tǒng)中默認(rèn)定義了兩級(jí)緩存:一級(jí)緩存和二級(jí)緩存
- 默認(rèn)情況下,只有一級(jí)緩存開(kāi)啟。(SqlSession級(jí)別的緩存,也稱(chēng)為本地緩存)
- 二級(jí)緩存需要手動(dòng)開(kāi)啟和配置,他是基于namespace級(jí)別的緩存。
- 為了提高擴(kuò)展性,MyBatis定義了緩存接口Cache。我們可以通過(guò)實(shí)現(xiàn)Cache接口來(lái)自定義二級(jí)緩存
5、一級(jí)緩存
一級(jí)緩存也叫本地緩存:
- 與數(shù)據(jù)庫(kù)同一次會(huì)話(huà)期間查詢(xún)到的數(shù)據(jù)會(huì)放在本地緩存中。
- 以后如果需要獲取相同的數(shù)據(jù),直接從緩存中拿,沒(méi)必須再去查詢(xún)數(shù)據(jù)庫(kù);
6、一級(jí)緩存失效的四種情況
- sqlSession不同
- sqlSession相同,查詢(xún)條件不同
- sqlSession相同,兩次查詢(xún)之間執(zhí)行了增刪改操作!
- sqlSession相同,手動(dòng)清除一級(jí)緩存
@Test
public void testQueryUserById(){
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
System.out.println(user);
session.clearCache();//手動(dòng)清除緩存
User user2 = mapper.queryUserById(1);
System.out.println(user2);
System.out.println(user==user2);
session.close();
}
所以說(shuō),一級(jí)緩存就是一個(gè)map
7、二級(jí)緩存
- 二級(jí)緩存也叫全局緩存,一級(jí)緩存作用域太低了,所以誕生了二級(jí)緩存
- 基于namespace級(jí)別的緩存,一個(gè)名稱(chēng)空間,對(duì)應(yīng)一個(gè)二級(jí)緩存;
- 工作機(jī)制
- 一個(gè)會(huì)話(huà)查詢(xún)一條數(shù)據(jù),這個(gè)數(shù)據(jù)就會(huì)被放在當(dāng)前會(huì)話(huà)的一級(jí)緩存中;
- 如果當(dāng)前會(huì)話(huà)關(guān)閉了,這個(gè)會(huì)話(huà)對(duì)應(yīng)的一級(jí)緩存就沒(méi)了;但是我們想要的是,會(huì)話(huà)關(guān)閉了,一級(jí)緩存中的數(shù)據(jù)被保存到二級(jí)緩存中;
- 新的會(huì)話(huà)查詢(xún)信息,就可以從二級(jí)緩存中獲取內(nèi)容;
- 不同的mapper查出的數(shù)據(jù)會(huì)放在自己對(duì)應(yīng)的緩存(map)中;
使用步驟:
核心配置文件
<setting name="cacheEnabled" value="true"/>
去每個(gè)mapper.xml中配置使用二級(jí)緩存,這個(gè)配置非常簡(jiǎn)單;
方式一:
<cache/>
方式二:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
這個(gè)更高級(jí)的配置創(chuàng)建了一個(gè) FIFO 緩存,每隔 60 秒刷新,最多可以存儲(chǔ)結(jié)果對(duì)象或列表的 512 個(gè)引用,而且返回的對(duì)象被認(rèn)為是只讀的,因此對(duì)它們進(jìn)行修改可能會(huì)在不同線(xiàn)程中的調(diào)用者產(chǎn)生沖突。
8、結(jié)論
只要開(kāi)啟了二級(jí)緩存,我們?cè)谕粋€(gè)Mapper中的查詢(xún),可以在二級(jí)緩存中拿到數(shù)據(jù)
查出的數(shù)據(jù)都會(huì)被默認(rèn)先放在一級(jí)緩存中
只有會(huì)話(huà)提交或者關(guān)閉以后,一級(jí)緩存中的數(shù)據(jù)才會(huì)轉(zhuǎn)到二級(jí)緩存中
原理圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存
- 解決spring結(jié)合mybatis時(shí)一級(jí)緩存失效的問(wèn)題
- Mybatis如何實(shí)現(xiàn)延遲加載及緩存
- MyBatis緩存實(shí)現(xiàn)原理及代碼實(shí)例解析
- MyBatis整合Redis實(shí)現(xiàn)二級(jí)緩存的示例代碼
- Mybatis-plus基于redis實(shí)現(xiàn)二級(jí)緩存過(guò)程解析
- MyBatis開(kāi)啟二級(jí)緩存實(shí)現(xiàn)過(guò)程解析
- Mybatis如何通過(guò)注解開(kāi)啟使用二級(jí)緩存
- mybatis plus使用redis作為二級(jí)緩存的方法
- SpringBoot下Mybatis的緩存的實(shí)現(xiàn)步驟
- 詳解Mybatis的緩存
相關(guān)文章
Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐
本文主要介紹了Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
java讀取枚舉類(lèi)的值轉(zhuǎn)成list和map方式
這篇文章主要介紹了java讀取枚舉類(lèi)的值轉(zhuǎn)成list和map方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
解答為什么 Java 線(xiàn)程沒(méi)有Running狀態(tài)
Java 線(xiàn)程沒(méi)有Running狀態(tài)指的是一個(gè)在 JVM 中執(zhí)行 的線(xiàn)程處于的狀態(tài),本文小編將為大家詳解一二,需要的朋友可以參考下面文章具體內(nèi)容2021-09-09
java實(shí)現(xiàn)簡(jiǎn)易版圖形界面計(jì)算器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易版圖形界面計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Springboot項(xiàng)目升級(jí)2.2.x升至2.7.x的示例代碼
本文主要介紹了Springboot項(xiàng)目升級(jí)2.2.x升至2.7.x的示例代碼,會(huì)有很多的坑,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
java實(shí)現(xiàn)大文件分割與合并的實(shí)例代碼
java實(shí)現(xiàn)大文件分割與合并的實(shí)例代碼,需要的朋友可以參考一下2013-03-03
Java判斷范圍型的數(shù)據(jù)是否存在重疊的方法
遇到了個(gè)問(wèn)題,同一天可以輸入多個(gè)時(shí)間段,但是每個(gè)時(shí)間段的時(shí)間不能出現(xiàn)重疊,這不就是判斷數(shù)據(jù)返回是否有重疊的變種嗎,所以本文給大家介紹了Java判斷范圍型的數(shù)據(jù)是否存在重疊的方法,需要的朋友可以參考下2024-07-07

