網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
今天來(lái)講一下Mybatis的一級(jí)緩存, 二級(jí)緩存及其區(qū)別
目錄
一. 緩存是什么
二. 一級(jí)緩存
? ? ? ? 一級(jí)緩存是什么
? ? ? ? 一級(jí)緩存何時(shí)清空?
? ? ? ? 一級(jí)緩存的流程圖
三. 二級(jí)緩存
? ? ? ? 二級(jí)緩存是什么
????????二級(jí)緩存何時(shí)存入
????????二級(jí)緩存有過(guò)期時(shí)間,但沒(méi)有后臺(tái)線程進(jìn)行檢測(cè)?
? ? ? ? 二級(jí)緩存的流程圖
注意事項(xiàng)
一. 緩存是什么
????????緩存其實(shí)就是存儲(chǔ)在內(nèi)存中的臨時(shí)數(shù)據(jù),這里的數(shù)據(jù)量會(huì)比較小,一般來(lái)說(shuō),服務(wù)器的內(nèi)存也是有限的,不可能將所有的數(shù)據(jù)都放到服務(wù)器的內(nèi)存里面,所以, 只會(huì)把關(guān)鍵數(shù)據(jù)放到緩存中,? 這樣的話訪問(wèn)起來(lái)非??? 而且方便(doge),當(dāng) Mybatis 調(diào)用 Dao 層查詢數(shù)據(jù)庫(kù)時(shí),先查詢二級(jí)緩存,二級(jí)緩存中無(wú)對(duì)應(yīng)數(shù)據(jù),再去查詢一級(jí)緩存,一級(jí)緩存中也沒(méi)有,最后去數(shù)據(jù)庫(kù)查找。
二. 一級(jí)緩存
? ? ? ? 一級(jí)緩存是什么
?????????一級(jí)緩存作用域是sqlsession級(jí)別的,同一個(gè)sqlsession中執(zhí)行相同的sql查詢(相同的sql和參數(shù)),第一次會(huì)去查詢數(shù)據(jù)庫(kù)并寫到緩存中,第二次從一級(jí)緩存中取。
? ? ? ? 一級(jí)緩存何時(shí)清空?
????????如果中間sqlSession去執(zhí)行commit操作(執(zhí)行插入、更新、刪除),則會(huì)清空SqlSession中的一級(jí)緩存,這樣做的目的為了讓緩存中存儲(chǔ)的是最新的信息,避免臟讀。一級(jí)緩存時(shí)執(zhí)行commit,close,增刪改等操作,就會(huì)清空當(dāng)前的一級(jí)緩存;當(dāng)對(duì)SqlSession執(zhí)行更新操作(update、delete、insert)后并執(zhí)行commit時(shí),不僅清空其自身的一級(jí)緩存(執(zhí)行更新操作的效果),也清空二級(jí)緩存(執(zhí)行commit()的效果)。
? ? ? ? 一級(jí)緩存的流程圖
三. 二級(jí)緩存
? ? ? ? 二級(jí)緩存是什么
????????二級(jí)緩存指的是Mybatis中SqlSessionFactory對(duì)象的緩存。由同一個(gè)SqlSessionFactory對(duì)象創(chuàng)建的SqlSession共享其緩存。
????????二級(jí)緩存是 mapper 映射級(jí)別的緩存,多個(gè) SqlSession 去操作同一個(gè) Mapper 映射的 sql 語(yǔ)句,多個(gè)SqlSession 可以共用二級(jí)緩存,二級(jí)緩存是跨 SqlSession 的。
????????二級(jí)緩存何時(shí)存入
????????在關(guān)閉sqlsession后(close),才會(huì)把該sqlsession一級(jí)緩存中的數(shù)據(jù)添加到namespace的二級(jí)緩存中。
????????開(kāi)啟了二級(jí)緩存后,還需要將要緩存的pojo實(shí)現(xiàn)Serializable接口,為了將緩存數(shù)據(jù)取出執(zhí)行反序列化操作,因?yàn)槎?jí)緩存數(shù)據(jù)存儲(chǔ)介質(zhì)多種多樣,不一定只存在內(nèi)存中,有可能存在硬盤中。
????????二級(jí)緩存有過(guò)期時(shí)間,但沒(méi)有后臺(tái)線程進(jìn)行檢測(cè)?
?????? ? ? ?
????????需要注意的是,并不是key-value的過(guò)期時(shí)間,而是這個(gè)cache的過(guò)期時(shí)間,是flushInterval,意味著整個(gè)清空緩存cache,所以不需要后臺(tái)線程去定時(shí)檢測(cè)。每當(dāng)存取數(shù)據(jù)的時(shí)候,都有檢測(cè)一下cache的生命時(shí)間,默認(rèn)是1小時(shí),如果這個(gè)cache存活了一個(gè)小時(shí),那么將整個(gè)清空一下。
?
? ? ? ? 二級(jí)緩存的流程圖
?
注意事項(xiàng)
- 映射語(yǔ)句文件中的所有 select 語(yǔ)句的結(jié)果將會(huì)被緩存。
- 映射語(yǔ)句文件中的所有 insert、update 和 delete 語(yǔ)句會(huì)刷新緩存。
- 緩存會(huì)使用最近最少使用算法(LRU, Least Recently Used)算法來(lái)清除不需要的緩存。
- 緩存不會(huì)定時(shí)進(jìn)行刷新(也就是說(shuō),沒(méi)有刷新間隔)。
- 緩存會(huì)保存列表或?qū)ο螅o(wú)論查詢方法返回哪種)的 1024 個(gè)引用。
- 緩存會(huì)被視為讀/寫緩存,這意味著獲取到的對(duì)象并不是共享的,可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。
?
原文鏈接:https://blog.csdn.net/annotation_PLZ/article/details/126923850
相關(guān)推薦
- 2022-07-09 利用go語(yǔ)言判斷是否是完全二叉樹(shù)_Golang
- 2022-04-09 C++實(shí)現(xiàn)加減乘除計(jì)算器_C 語(yǔ)言
- 2022-11-21 初識(shí)Golang?Mutex互斥鎖的使用_Golang
- 2022-07-14 一文教會(huì)你用redux實(shí)現(xiàn)computed計(jì)算屬性_React
- 2023-07-09 TortoiseSVN速度只有幾kb,特別緩慢,解決辦法
- 2023-06-17 詳解Flask數(shù)據(jù)庫(kù)的連接與使用_python
- 2022-07-19 Compose中更靈活易用的TextField以及密碼輸入框
- 2023-03-19 詳解OpenMP的線程同步機(jī)制_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支