網站首頁 編程語言 正文
今天來講一下Mybatis的一級緩存, 二級緩存及其區別
目錄
一. 緩存是什么
二. 一級緩存
? ? ? ? 一級緩存是什么
? ? ? ? 一級緩存何時清空?
? ? ? ? 一級緩存的流程圖
三. 二級緩存
? ? ? ? 二級緩存是什么
????????二級緩存何時存入
????????二級緩存有過期時間,但沒有后臺線程進行檢測?
? ? ? ? 二級緩存的流程圖
注意事項
一. 緩存是什么
????????緩存其實就是存儲在內存中的臨時數據,這里的數據量會比較小,一般來說,服務器的內存也是有限的,不可能將所有的數據都放到服務器的內存里面,所以, 只會把關鍵數據放到緩存中,? 這樣的話訪問起來非常快, 而且方便(doge),當 Mybatis 調用 Dao 層查詢數據庫時,先查詢二級緩存,二級緩存中無對應數據,再去查詢一級緩存,一級緩存中也沒有,最后去數據庫查找。
二. 一級緩存
? ? ? ? 一級緩存是什么
?????????一級緩存作用域是sqlsession級別的,同一個sqlsession中執行相同的sql查詢(相同的sql和參數),第一次會去查詢數據庫并寫到緩存中,第二次從一級緩存中取。
? ? ? ? 一級緩存何時清空?
????????如果中間sqlSession去執行commit操作(執行插入、更新、刪除),則會清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。一級緩存時執行commit,close,增刪改等操作,就會清空當前的一級緩存;當對SqlSession執行更新操作(update、delete、insert)后并執行commit時,不僅清空其自身的一級緩存(執行更新操作的效果),也清空二級緩存(執行commit()的效果)。
? ? ? ? 一級緩存的流程圖
三. 二級緩存
? ? ? ? 二級緩存是什么
????????二級緩存指的是Mybatis中SqlSessionFactory對象的緩存。由同一個SqlSessionFactory對象創建的SqlSession共享其緩存。
????????二級緩存是 mapper 映射級別的緩存,多個 SqlSession 去操作同一個 Mapper 映射的 sql 語句,多個SqlSession 可以共用二級緩存,二級緩存是跨 SqlSession 的。
????????二級緩存何時存入
????????在關閉sqlsession后(close),才會把該sqlsession一級緩存中的數據添加到namespace的二級緩存中。
????????開啟了二級緩存后,還需要將要緩存的pojo實現Serializable接口,為了將緩存數據取出執行反序列化操作,因為二級緩存數據存儲介質多種多樣,不一定只存在內存中,有可能存在硬盤中。
????????二級緩存有過期時間,但沒有后臺線程進行檢測?
?????? ? ? ?
????????需要注意的是,并不是key-value的過期時間,而是這個cache的過期時間,是flushInterval,意味著整個清空緩存cache,所以不需要后臺線程去定時檢測。每當存取數據的時候,都有檢測一下cache的生命時間,默認是1小時,如果這個cache存活了一個小時,那么將整個清空一下。
?
? ? ? ? 二級緩存的流程圖
?
注意事項
- 映射語句文件中的所有 select 語句的結果將會被緩存。
- 映射語句文件中的所有 insert、update 和 delete 語句會刷新緩存。
- 緩存會使用最近最少使用算法(LRU, Least Recently Used)算法來清除不需要的緩存。
- 緩存不會定時進行刷新(也就是說,沒有刷新間隔)。
- 緩存會保存列表或對象(無論查詢方法返回哪種)的 1024 個引用。
- 緩存會被視為讀/寫緩存,這意味著獲取到的對象并不是共享的,可以安全地被調用者修改,而不干擾其他調用者或線程所做的潛在修改。
?
原文鏈接:https://blog.csdn.net/annotation_PLZ/article/details/126923850
- 上一篇:車載藍牙PIN碼是什么
- 下一篇:數據庫基本增刪改查語法和多表鏈接查詢的方式
相關推薦
- 2022-09-14 關于Python文本生成的Beam?Search解碼問題_python
- 2023-12-18 YAMLException異常產生原因及解決方案
- 2023-07-24 在excel里寫一行數字,復制后直接粘貼到表格不同列
- 2022-12-09 ReactQuery系列之數據轉換示例詳解_React
- 2022-08-07 使用pd.merge表連接出現多余行的問題解決_python
- 2022-04-01 git clone 失敗
- 2022-06-20 C語言三種方法解決輪轉數組問題_C 語言
- 2023-01-29 Python??序列化反序列化和異常處理的問題小結_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支