Mybatis 緩存原理及失效情況解析
這篇文章主要介紹了Mybatis 緩存原理及失效情況解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
1、什么是緩存[Cache]
- 存在內(nèi)存中的臨時數(shù)據(jù)。
- 將用戶經(jīng)常查詢的數(shù)據(jù)放在緩存(內(nèi)存)中,用戶去查詢數(shù)據(jù)就不用從磁盤上(關(guān)系型數(shù)據(jù)庫數(shù)據(jù)文件)查詢,從緩存中查詢,從而提高查詢效率,解決了高并發(fā)系統(tǒng)的性能問題。
2、為什么要使用緩存
減少和數(shù)據(jù)庫的交互次數(shù),減少系統(tǒng)開銷,提高系統(tǒng)效率。
3、什么樣的數(shù)據(jù)需要使用緩存
經(jīng)常查詢且不易改變的數(shù)據(jù)
4、Mybatis緩存
- MyBatis包含一個非常強(qiáng)大的查詢緩存特性,它可以非常方便地定制和配置緩存。緩存可以極大的提升查詢效率。
- MyBatis系統(tǒng)中默認(rèn)定義了兩級緩存:一級緩存和二級緩存
- 默認(rèn)情況下,只有一級緩存開啟。(SqlSession級別的緩存,也稱為本地緩存)
- 二級緩存需要手動開啟和配置,他是基于namespace級別的緩存。
- 為了提高擴(kuò)展性,MyBatis定義了緩存接口Cache。我們可以通過實現(xiàn)Cache接口來自定義二級緩存
5、一級緩存
一級緩存也叫本地緩存:
- 與數(shù)據(jù)庫同一次會話期間查詢到的數(shù)據(jù)會放在本地緩存中。
- 以后如果需要獲取相同的數(shù)據(jù),直接從緩存中拿,沒必須再去查詢數(shù)據(jù)庫;
6、一級緩存失效的四種情況
- sqlSession不同
- sqlSession相同,查詢條件不同
- sqlSession相同,兩次查詢之間執(zhí)行了增刪改操作!
- sqlSession相同,手動清除一級緩存
@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();//手動清除緩存 User user2 = mapper.queryUserById(1); System.out.println(user2); System.out.println(user==user2); session.close(); }
所以說,一級緩存就是一個map
7、二級緩存
- 二級緩存也叫全局緩存,一級緩存作用域太低了,所以誕生了二級緩存
- 基于namespace級別的緩存,一個名稱空間,對應(yīng)一個二級緩存;
- 工作機(jī)制
- 一個會話查詢一條數(shù)據(jù),這個數(shù)據(jù)就會被放在當(dāng)前會話的一級緩存中;
- 如果當(dāng)前會話關(guān)閉了,這個會話對應(yīng)的一級緩存就沒了;但是我們想要的是,會話關(guān)閉了,一級緩存中的數(shù)據(jù)被保存到二級緩存中;
- 新的會話查詢信息,就可以從二級緩存中獲取內(nèi)容;
- 不同的mapper查出的數(shù)據(jù)會放在自己對應(yīng)的緩存(map)中;
使用步驟:
核心配置文件
<setting name="cacheEnabled" value="true"/>
去每個mapper.xml中配置使用二級緩存,這個配置非常簡單;
方式一:
<cache/>
方式二:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
這個更高級的配置創(chuàng)建了一個 FIFO 緩存,每隔 60 秒刷新,最多可以存儲結(jié)果對象或列表的 512 個引用,而且返回的對象被認(rèn)為是只讀的,因此對它們進(jìn)行修改可能會在不同線程中的調(diào)用者產(chǎn)生沖突。
8、結(jié)論
只要開啟了二級緩存,我們在同一個Mapper中的查詢,可以在二級緩存中拿到數(shù)據(jù)
查出的數(shù)據(jù)都會被默認(rèn)先放在一級緩存中
只有會話提交或者關(guān)閉以后,一級緩存中的數(shù)據(jù)才會轉(zhuǎn)到二級緩存中
原理圖:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot + Mybatis-plus實戰(zhàn)之Mybatis-plus的一級緩存、二級緩存
- 解決spring結(jié)合mybatis時一級緩存失效的問題
- Mybatis如何實現(xiàn)延遲加載及緩存
- MyBatis緩存實現(xiàn)原理及代碼實例解析
- MyBatis整合Redis實現(xiàn)二級緩存的示例代碼
- Mybatis-plus基于redis實現(xiàn)二級緩存過程解析
- MyBatis開啟二級緩存實現(xiàn)過程解析
- Mybatis如何通過注解開啟使用二級緩存
- mybatis plus使用redis作為二級緩存的方法
- SpringBoot下Mybatis的緩存的實現(xiàn)步驟
- 詳解Mybatis的緩存
相關(guān)文章
Java并發(fā)編程之JUC并發(fā)核心AQS同步隊列原理剖析
AbstractQueuedSynchronizer 簡稱 AQS,可能我們幾乎不會直接去使用它,但它卻是 JUC 的核心基礎(chǔ)組件,支撐著 java 鎖和同步器的實現(xiàn),大神 Doug Lea 在設(shè)計 JUC 包時希望能夠抽象一個基礎(chǔ)且通用的組件以支撐上層模塊的實現(xiàn),AQS 應(yīng)運(yùn)而生2021-09-09java常用工具類 Reflect反射工具類、String字符串工具類
這篇文章主要為大家詳細(xì)介紹了java常用工具類,包括Reflect反射工具類、String字符串工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05json-lib將json格式的字符串,轉(zhuǎn)化為java對象的實例
下面小編就為大家?guī)硪黄猨son-lib將json格式的字符串,轉(zhuǎn)化為java對象的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03Docker容器使用宿主機(jī)上的mongod/redis等服務(wù)詳解
這篇文章主要介紹了Docker容器使用宿主機(jī)上的mongod/redis等服務(wù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11tk-mybatis整合springBoot使用兩個數(shù)據(jù)源的方法
單純的使用mybaits進(jìn)行多數(shù)據(jù)配置網(wǎng)上資料很多,但是關(guān)于tk-mybaits多數(shù)據(jù)源配置沒有相關(guān)材料,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2021-12-12解決java調(diào)用python代碼返回值中文亂碼問題
這篇文章主要介紹了解決java調(diào)用python代碼返回值中文亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05