Mybatis中緩存機制的理解以及優缺點

文章目錄

      • 一、MyBatis 緩存機制詳解
        • 1. 一級緩存(Local Cache)
        • 2. 二級緩存(Global Cache)
        • 3. 緩存執行順序
      • 二、MyBatis 緩存的優點
      • 三、MyBatis 緩存的缺點
      • 四、適用場景與最佳實踐
      • 總結

MyBatis 提供了完善的緩存機制,用于減少了數據庫訪問次數,提升查詢性能。其緩存體系分為一級緩存(本地緩存)和二級緩存(全局緩存),兩者配合使用形成了 MyBatis 的緩存體系。

一、MyBatis 緩存機制詳解

1. 一級緩存(Local Cache)
  • 作用范圍:SqlSession 級別(即同一個數據庫會話內有效)。
  • 實現原理:默認開啟,無需配置。MyBatis 在 SqlSession 內部維護一個 HashMap 作為緩存容器,鍵為 CacheKey(由 SQL 語句、參數、RowBounds、環境等信息生成),值為查詢結果。
  • 生命周期:與 SqlSession 一致,當 SqlSession 關閉(close())或提交(commit())、回滾(rollback())時,一級緩存會被清空。
  • 觸發場景
  • 同一 SqlSession 中,執行相同的查詢(SQL 語句、參數、分頁等完全一致),會直接從緩存獲取結果,不執行 SQL。
  • 若 SqlSession 中執行了增刪改操作(insert/update/delete),MyBatis 會自動清空一級緩存,避免臟數據。
2. 二級緩存(Global Cache)
  • 作用范圍:Mapper 接口級別(跨 SqlSession 共享,多個 SqlSession 可共享同一 Mapper 的緩存)。
  • 實現原理:默認關閉,需手動開啟。開啟后,MyBatis 會為每個 Mapper 接口創建一個緩存對象(可自定義緩存實現,如 Redis、EhCache 等),查詢結果會先存入一級緩存,當 SqlSession 關閉時,一級緩存的數據會被刷入二級緩存。
  • 開啟方式
  1. 在 MyBatis 配置文件中開啟全局二級緩存(默認 true,可省略):
 ```xml<settings><setting name="cacheEnabled" value="true"/></settings>```
  1. 在 Mapper 接口或 XML 中聲明使用二級緩存:
 - XML 方式:在 Mapper.xml 中添加 `<cache/>` 標簽。- 注解方式:在 Mapper 接口上添加 `@CacheNamespace` 注解。
  • 緩存策略:可通過 <cache> 標簽的屬性配置,如 eviction(回收策略,如 LRU、FIFO)、flushInterval(自動刷新時間)、size(最大緩存條目)、readOnly(是否只讀)等。
  • 觸發清空:當 Mapper 中執行增刪改操作時,MyBatis 會清空該 Mapper 對應的二級緩存。
3. 緩存執行順序

查詢數據時,MyBatis 會按以下順序查找緩存:
二級緩存 → 一級緩存 → 數據庫

  • 若二級緩存命中,直接返回結果。
  • 若二級緩存未命中,查詢一級緩存,命中則返回。
  • 若一級緩存也未命中,執行 SQL 查詢數據庫,結果依次存入一級緩存和二級緩存(當 SqlSession 關閉時)。

二、MyBatis 緩存的優點

  1. 減少數據庫訪問:緩存命中時無需執行 SQL,降低數據庫壓力,尤其適合高頻查詢、低頻修改的數據(如商品分類、字典表)。
  2. 提升查詢性能:緩存查詢為內存操作,響應速度遠快于數據庫 IO,可顯著減少接口響應時間。
  3. 一級緩存自動維護:無需手動配置,默認生效,適合單會話內的重復查詢(如一次請求中多次查詢同一用戶信息)。
  4. 二級緩存靈活性高:支持自定義緩存實現(如集成 Redis 實現分布式緩存),可根據業務需求配置回收策略、過期時間等。
  5. 與事務兼容:增刪改操作會自動清空相關緩存,減少臟數據風險(需正確使用)。

三、MyBatis 緩存的缺點

  1. 一級緩存局限性
  • 僅在 SqlSession 內有效,多會話共享數據需依賴二級緩存。
  • 若 SqlSession 未關閉,長時間持有緩存可能導致數據過期(如其他會話修改了數據,當前會話仍使用舊緩存)。
  1. 二級緩存潛在問題
  • 臟數據風險:多表關聯查詢時,若關聯表的數據在其他 Mapper 中修改,當前 Mapper 的二級緩存可能未同步更新,導致查詢到臟數據。
    例如:OrderMapper 緩存了包含用戶信息的訂單數據,若 UserMapper 修改了用戶信息,OrderMapper 的緩存仍為舊數據。
  • 分布式環境不兼容:默認二級緩存為本地內存緩存,分布式系統中多節點緩存無法同步,可能導致數據不一致(需集成 Redis 等分布式緩存解決)。
  • 緩存鍵設計復雜CacheKey 依賴 SQL、參數、分頁等信息,若查詢條件細微差異(如參數順序不同),會導致緩存不命中,浪費緩存空間。
  1. 緩存維護成本
  • 需手動配置二級緩存,且需根據業務調整回收策略、過期時間等參數,增加開發成本。
  • 對于高頻修改的數據(如庫存、訂單狀態),緩存命中率低,反而可能因緩存更新帶來額外開銷。
  1. 調試難度增加:緩存的存在可能掩蓋 SQL 性能問題(如慢查詢因緩存命中未暴露),且排查緩存相關的臟數據問題較為復雜。

四、適用場景與最佳實踐

  • 適合使用緩存
  • 高頻查詢、低頻修改的數據(如商品類目、地區信息、字典表)。
  • 單表查詢或關聯關系簡單的查詢(避免多表關聯導致的緩存不一致)。
  • 分布式環境下,建議使用 Redis 等分布式緩存替代默認二級緩存。
  • 不適合使用緩存
  • 高頻修改的數據(如庫存、實時銷量)。
  • 多表關聯復雜的查詢(難以保證緩存一致性)。
  • 數據實時性要求極高的場景(如金融交易數據)。
  • 最佳實踐
  • 優先利用一級緩存,避免在 SqlSession 中執行無關操作,減少緩存無效清空。
  • 二級緩存按需開啟,對核心 Mapper 單獨配置,避免全局開啟導致的緩存膨脹。
  • 多表關聯查詢時,可通過 @CacheNamespaceRef 關聯相關 Mapper,確保緩存同步清空。
  • 分布式系統中,集成 Redis 作為二級緩存,保證緩存一致性。

總結

MyBatis 緩存機制通過一級緩存和二級緩存的配合,有效提升了查詢性能,但也存在緩存一致性、分布式兼容等問題。實際使用中需根據業務場景合理配置,權衡性能與數據準確性,避免濫用緩存導致的隱性問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94595.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94595.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust 登堂 之 類型轉換(三)

Rust 是類型安全的語言&#xff0c;因此在Rust 中做類型轉換不是一件簡單的事&#xff0c;這一章節&#xff0c;我們將對Rust 中的類型轉換進行詳盡講解。 高能預警&#xff0c;本章節有些難&#xff0c;可以考慮學了進階后回頭再看 as 轉換 先來看一段代碼 fn main() {let a…

【MySQL 為什么默認會給 id 建索引? MySQL 主鍵索引 = 聚簇索引?】

MySQL 索引 MySQL 為什么默認會給 id 建索引&#xff1f; & MySQL 主鍵索引 聚簇索引&#xff1f; 結論&#xff1a;在 MySQL (InnoDB) 中&#xff0c;主鍵索引是自動創建的聚簇索引&#xff0c;不需要刪除&#xff0c;其他索引是補充優化。 1. MySQL 的id 索引是怎么來的…

[光學原理與應用-321]:皮秒深紫外激光器產品不同階段使用的工具軟件、對應的輸出文件

在皮秒深紫外激光器的開發過程中&#xff0c;不同階段使用的工具軟件及其對應的輸出文件如下&#xff1a;一、設計階段工具軟件&#xff1a;Zemax OpticStudio&#xff1a;用于光學系統的初步設計和仿真&#xff0c;包括光線追跡、像差分析、優化設計等。MATLAB&#xff1a;用于…

openEuler常用操作指令

openEuler常用操作指令 一、前言 1.簡介 openEuler是由開放原子開源基金會孵化的全場景開源操作系統項目&#xff0c;面向數字基礎設施四大核心場景&#xff08;服務器、云計算、邊緣計算、嵌入式&#xff09;&#xff0c;全面支持ARM、x86、RISC-V、loongArch、PowerPC、SW…

Python爬蟲實戰:構建網易云音樂個性化音樂播放列表同步系統

1. 引言 1.1 研究背景 在數字音樂生態中,各大音樂平臺憑借獨家版權、個性化推薦等優勢占據不同市場份額。根據國際唱片業協會(IFPI)2024 年報告,全球流媒體音樂用戶已突破 50 億,其中超過 60% 的用戶同時使用 2 個及以上音樂平臺。用戶在不同平臺積累的播放列表包含大量…

vscode 配置 + androidStudio配置

插件代碼片段 餓了么 icon{"Print to console": {"prefix": "ii-ep-","body": ["i-ep-"],"description": "elementPlus Icon"} }Ts 初始化模版{"Print to console": {"prefix": &q…

DQN(深度Q網絡):深度強化學習的里程碑式突破

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; ? 1. DQN概述&#xff1a;當深度學習遇見強化學習 DQN&#xff08;D…

個人博客運行3個月記錄

個人博客 自推一波&#xff0c;目前我的Hexo個人博客已經優化的足夠好了&#xff0c; 已經足夠穩定的和簡單進行發布和管理&#xff0c;但還是有不少問題&#xff0c;總之先記下來再說 先總結下 關于評論系統方面&#xff0c;我從Waline (快速上手 | Waline) 更換成了&#x…

C89標準關鍵字以及運算符分類匯總

開發單片機項目學好C語言尤其重要&#xff0c;我感覺學習C語言需要先學好關鍵字和運算符&#xff0c;我對C語言的關鍵字和運算符做一下匯總。一、關鍵字&#xff1a;&#xff08;C89標準一共有32個關鍵字&#xff09;(1) 數據類型關鍵字&#xff08;一共12個&#xff0c;分為基…

吱吱企業通訊軟件打破跨部門溝通壁壘,為企業搭建安全的通訊環境

在數字化轉型浪潮中&#xff0c;企業通訊軟件不再僅僅作為企業跨部門溝通橋梁&#xff0c;更是承載著保護通訊數據安全的使命。吱吱企業通訊憑借其“私有化部署全鏈路加密”雙重機制&#xff0c;為企業構建了一套“溝通便捷、通訊安全”的數字化通訊解決方案。 一、打破溝通壁壘…

Day16_【機器學習建模流程】

一、機器學習建模流程&#xff1a;獲取數據&#xff08;搜集與完成機器學習任務相關的數據集&#xff09;數據基本處理&#xff08;數據 缺失值處理&#xff0c;異常值處理&#xff09;特征工程&#xff08;特征提取、特征預處理 、特征降維、特征選擇 、特征組合&#xff09;機…

【不說廢話】pytorch中.to(device)函數詳解

1. 這個函數是什么&#xff1f; .to(device) 是 PyTorch 中一個用于張量和模型在設備&#xff08;CPU 或 GPU&#xff09;之間移動的核心函數。這里的 “設備” &#xff08;device&#xff09; 通常指的是計算發生的硬件位置&#xff0c;最常見的是&#xff1a; CPU&#xff1…

基于matplotlib庫的python可視化:以北京市各區降雨量為例

一、實驗目的1. 掌握使用Python的pandas、matplotlib和seaborn庫進行數據可視化的方法 2. 學習制作杠鈴圖、堆積柱狀圖和折線圖等多種圖表類型 3. 分析北京市各區在特定時間段內的降雨量的變化規律 4. 培養數據分析和可視化的實踐能力二、實驗數據數據來源&#xff1a;北京市水…

SCDN如何提示網站性能和安全防護

SCDN&#xff08;Secure Content Delivery Network&#xff0c;安全內容分發網絡&#xff09;是融合了傳統 CDN&#xff08;內容分發網絡&#xff09;性能加速能力與專業安全防護能力的新一代網絡服務&#xff0c;核心目標是在 “快速分發內容” 的基礎上&#xff0c;同步解決網…

PowerShell遠程加載Mimikatz完全指南:從原理到實戰

PowerShell遠程加載Mimikatz完全指南&#xff1a;從原理到實戰無文件攻擊技術是現代滲透測試的核心技能&#xff0c;掌握PowerShell遠程加載Mimikatz對白帽子黑客至關重要1 引言 在當今的網絡安全領域&#xff0c;無文件攻擊(fileless attack)已成為高級持久性威脅(APT)的主要手…

基于Spring Boot的民宿服務管理系統-項目分享

基于Spring Boot的民宿服務管理系統-項目分享項目介紹項目摘要系統總體結構圖民宿資訊信息實體圖項目預覽民宿信息管理頁面民宿咨詢管理頁面已支付訂單管理頁面用戶主頁面寫在最后項目介紹 使用者&#xff1a;管理員、用戶 開發技術&#xff1a;MySQLJavaSpringBootVue 項目摘…

SpringBoot基礎知識-從XML配置文件到Java Config

項目結構與依賴首先&#xff0c;我們需要添加 Spring 核心依賴&#xff1a;<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version> </dependency>項目…

用無標簽語音自我提升音頻大模型:SI-SDA 方法詳解

用無標簽語音自我提升音頻大模型:SI-SDA 方法詳解 在語音識別和處理領域,近年來大模型(Large Language Models, LLMs)的發展迅速,為語音任務帶來了新的突破。然而,語音信號的復雜性使得這些模型在特定領域中表現不佳。如何在沒有標注數據的情況下提升音頻大模型的表現?…

開源工具新玩法:cpolar提升Penpot協作流暢度

文章目錄前言1. 安裝Docker2. Docker鏡像源添加方法3. 創建并啟動Penpot容器3. 本地使用Penpot進行創作4. 公網遠程訪問本地Penpot4.1 內網穿透工具安裝4.2 創建遠程連接公網地址5. 固定Penpot公網地址前言 你是否也曾因商業設計軟件的高昂費用而放棄團隊協作&#xff1f;或者…

DINOv2 vs DINOv3 vs CLIP:自監督視覺模型的演進與可視化對比

近年來&#xff0c;自監督學習在計算機視覺領域取得了巨大進展&#xff0c;推動了無需人工標注即可學習強大視覺表示的視覺基礎模型&#xff08;Vision Foundation Models&#xff09;的發展。其中&#xff0c;DINOv2 和 CLIP 是兩個極具影響力的代表性工作&#xff0c;而最新的…