MyBatis 的一級、二級緩存

文章目錄

    • 1?? 一級緩存(Local Cache)
      • 📌 定義
      • 🚀 示例代碼
    • 2?? 二級緩存(Global Cache)
      • 📌 定義
      • 🚀 使用方式
    • 3?? 一級緩存 vs. 二級緩存 📊
    • 4?? 數據共享問題
      • 🔸 數據一致性問題
      • 🔸 并發訪問問題
      • 🔸 分布式環境中的緩存共享
    • 5?? 總結 🚀

MyBatis 提供了強大的緩存機制,以提高數據庫查詢性能。緩存主要分為 一級緩存二級緩存,它們分別應用于不同的范圍和場景。

1?? 一級緩存(Local Cache)

📌 定義

  • 作用范圍:SqlSession 級別
  • 存儲位置:SqlSession 內存中
  • 默認開啟
  • 失效條件:
    • SqlSession 關閉
    • 執行 insertupdatedelete 操作
    • 執行 select 時手動刷新緩存 sqlSession.clearCache()
    • 查詢不同的 SQL 語句

🚀 示例代碼

SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper1.getUserById(1); // 第一次查詢,數據從數據庫加載
User user2 = mapper1.getUserById(1); // 第二次查詢,數據從緩存獲取
sqlSession1.close();

2?? 二級緩存(Global Cache)

📌 定義

  • 作用范圍:Mapper(Namespace)級別,多 SqlSession 共享
  • 存儲位置:MyBatis 全局級別緩存,通常存儲在 PerpetualCache
  • 默認關閉,需要手動開啟
  • 失效條件
    • 執行 insertupdatedelete 操作后,緩存會自動清除
    • 直接操作數據庫

🚀 使用方式

  1. 開啟二級緩存(在 mybatis-config.xmlmapper.xml 中設置):
<settings><setting name="cacheEnabled" value="true"/>
</settings>
  1. 在 Mapper 配置中啟用緩存
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
  • eviction="LRU":最近最少使用的緩存清理策略
  • flushInterval="60000":60 秒自動刷新緩存
  • size="512":最大緩存 512 個對象
  • readOnly="true":只讀,提高并發效率
  1. 示例代碼
SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper1.getUserById(1);
sqlSession1.close(); // 數據寫入二級緩存SqlSession sqlSession2 = sqlSessionFactory.openSession();
UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
User user2 = mapper2.getUserById(1); // 從二級緩存讀取數據
sqlSession2.close();

3?? 一級緩存 vs. 二級緩存 📊

對比項一級緩存二級緩存
作用范圍SqlSessionMapper(Namespace)級別,多 SqlSession 共享
默認開啟? 是? 否(需手動開啟)
失效條件SqlSession 關閉、增刪改操作增刪改操作、數據庫更新、緩存超時
適用場景單個會話內查詢優化適用于多個 SqlSession 共享數據

4?? 數據共享問題

二級緩存的主要作用之一是跨 SqlSession 共享數據,但也會引發一些問題:

🔸 數據一致性問題

  • 由于二級緩存存儲在 Mapper 級別,數據修改后不會立即更新緩存,可能導致數據不一致。
  • 解決方案:
    • 使用事務控制,確保數據庫更新后及時刷新緩存。
    • 定期刷新緩存,通過 flushInterval 機制自動更新。
    • 禁用二級緩存,對于高實時性數據建議不使用。

🔸 并發訪問問題

  • 默認情況下,MyBatis 二級緩存是 readOnly,多個線程訪問時不會有并發問題。
  • 如果設置 readOnly="false",則需要考慮線程安全問題。

🔸 分布式環境中的緩存共享

  • 單機應用:二級緩存可以有效減少數據庫訪問,提高性能。
  • 分布式應用:多個服務實例可能無法共享 MyBatis 二級緩存,導致緩存失效或不一致。
  • 解決方案:
    • 采用 Redis、EhCache 等第三方分布式緩存代替 MyBatis 內置緩存。
    • 結合 消息隊列(MQ) 機制,在數據更新時廣播清除緩存。

5?? 總結 🚀

? 一級緩存 適用于 單個 SqlSession,默認開啟,生命周期短。

? 二級緩存 適用于 多個 SqlSession 共享,默認關閉,需要手動開啟。

? 數據一致性問題 是二級緩存的關鍵挑戰,需謹慎使用。

? 分布式架構下建議使用第三方緩存(如 Redis)以實現緩存共享。

? 適用于 讀多寫少 的場景,如查詢熱門數據、字典數據等。

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

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

相關文章

軟件性能測試與功能測試聯系和區別

隨著軟件開發技術的迅猛發展&#xff0c;軟件性能測試和功能測試成為了確保軟件質量的兩個重要環節。那么只有一字之差的性能測試和功能測試分別是什么?又有哪些聯系和區別呢? 一、軟件性能測試是什么?   軟件性能測試是為了評估軟件系統在特定條件下的表現&#xff0c;包…

Vue 框架使用難點與易錯點剖析:避開陷阱,提升開發效率

Vue.js 作為當下最流行的前端框架之一&#xff0c;以其輕量、易用和靈活的特性深受開發者喜愛。然而&#xff0c;即使是經驗豐富的開發者&#xff0c;在使用 Vue 的過程中也難免會遇到一些難點和易錯點。本文將深入分析 Vue 開發中常見的“坑”&#xff0c;并提供解決方案和代碼…

基于大模型的上瞼下垂手術全流程預測與方案優化研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 研究意義 1.3 研究方法與創新點 二、上瞼下垂相關理論基礎 2.1 上瞼下垂的定義與分類 2.2 發病機制與影響 2.3 傳統治療方法概述 三、大模型技術原理與應用 3.1 大模型概述 3.2 在醫療領域的應用現狀 3.3 用于上瞼下垂預測的…

Odoo Http鑒權+調用后端接口

最近在調研Odoo18&#xff0c;包括它的前后端原理、源碼等。發現官方的開發文檔并不十分實用&#xff0c;比如標題這種簡單的實用需求&#xff0c;竟然浪費了一點時間&#xff0c;特此記錄。 官方文檔&#xff1a;External API — Odoo 18.0 documentation 前提&#xff1a;首…

【Go每日一練】實現簡單的控制臺計算器

&#x1f47b;創作者&#xff1a;丶重明 &#x1f47b;創作時間&#xff1a;2025年3月7日 &#x1f47b;擅長領域&#xff1a;運維 目錄 1.&#x1f636;?&#x1f32b;?題目&#xff1a;簡單的控制臺計算器2.&#x1f636;?&#x1f32b;?代碼輸出3.&#x1f636;?&#…

Linux常見問題與分析

操作系統進行線程切換時進行的動作 1. 保存當前線程的上下文 寄存器狀態&#xff1a;保存 CPU 寄存器&#xff08;如通用寄存器、程序計數器 PC、棧指針 SP 等&#xff09;到當前線程的 線程控制塊&#xff08;TCB&#xff09; 中。內核棧信息&#xff1a;如果線程在內核態運…

HTML塊級元素和內聯元素(簡單易懂)

在HTML中&#xff0c;元素可以分為塊級元素&#xff08;Block-level elements&#xff09;和內聯元素&#xff08;Inline elements&#xff09;。這兩類元素在頁面布局和樣式應用上有不同的特點和用途。 一、塊級元素&#xff08;Block-level elements&#xff09; 1. 定義 …

VSTO(C#)Excel開發6:與窗體交互

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

Node.js與VUE安裝

目錄 Win下載安裝 Mac下載安裝 Win與Mac配置檢查是否安裝成功切換淘寶NPM庫檢查鏡像配置是否生效設置 npm 全局環境目錄&#xff08;避免權限問題&#xff09;WinMac VUE CLI安裝安裝驗證打開vue面板 Vue腳手架npm init vuelatest、npm create vuelatestvue create、vue ui Win…

快速集成1688商品API:10分鐘實現跨境選品數據自動化

要快速集成 1688 商品 API 以實現跨境選品數據自動化&#xff0c;可參考以下步驟&#xff1a; 注冊并申請 API 權限&#xff1a;注冊賬號創建應用并申請所需的 API 權限&#xff0c;如商品搜索、篩選、獲取詳情等相關權限。獲取 API Key 和 Secret&#xff1a;在應用管理頁面獲…

解決 MySQL 遷移到達夢報錯 “無效的列名” 的問題

在數據庫遷移的過程中&#xff0c;常常會遇到各種各樣的問題。本文將聚焦于從源庫 MySQL&#xff08;大小寫不敏感&#xff09;遷移到目標庫達夢&#xff08;大小寫敏感&#xff09;時&#xff0c;出現的創建索引報錯 “無效的列名” 這一問題&#xff0c;使用SQLark工具如何避…

工程化與框架系列(31)--前端依賴管理實踐

前端依賴管理實踐 &#x1f4e6; 引言 前端依賴管理是現代Web開發中的重要環節。本文將深入探討前端依賴管理的最佳實踐&#xff0c;包括包管理工具、版本控制、依賴分析和優化等方面&#xff0c;幫助開發者更好地管理項目依賴。 依賴管理概述 前端依賴管理主要包括以下方面…

C/C++都有哪些開源的Web框架?

CppCMS CppCMS是一個采用C語言開發的高性能Web框架&#xff0c;通過模版元編程方式實現了在編譯期檢查RESTful路由系統&#xff0c;支持傳統的MVC模式和多種語言混合開發模式。 CppCMS最厲害的功能是WebSocket&#xff0c;10萬連接在內存中長期保存占用的大小不超過600MB&…

數據結構——環形數組

環形數組 start 指向第一個有效元素的索引&#xff0c;end 指向最后一個有效元素的下一個位置索引。 注意&#xff1a; start是閉區間&#xff0c;先左移后賦值&#xff0c;先賦值(null)后右移&#xff1b;end是開區間&#xff0c;先賦值再右移&#xff0c;先左移再賦值(null…

大數據學習(59)-DataX執行機制

&&大數據學習&& &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 承認自己的無知&#xff0c;乃是開啟智慧的大門 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一下博主哦&#x1f91…

云原生性能測試全解析:如何構建高效穩定的現代應用?

一、引言 隨著云計算技術的快速發展&#xff0c;云原生&#xff08;Cloud Native&#xff09;架構成為現代應用開發的主流模式。云原生應用通常采用微服務架構、容器化部署&#xff0c;并利用 Kubernetes&#xff08;K8s&#xff09;等編排工具進行管理。然而&#xff0c;云原…

golang的Map

Map集合 概述 Map 是一種無序的鍵值對的集合。 Map 最重要的一點是通過 key 來快速檢索數據&#xff0c;key 類似于索引&#xff0c;指向數據的值。 Map 是一種集合&#xff0c;所以我們可以像迭代數組和切片那樣迭代它。不過&#xff0c;Map 是無序的&#xff0c;遍歷 Map…

USB數據采集卡 Labview采集卡 32路AD模擬量采集 DAQ卡

今天給大家介紹阿爾泰科技的一款多功能數據采集卡USB3150/1/2/5/6 。 該板卡提供 32RSE / NRSE 通道或 16 通道 DIFF 模 擬量輸入&#xff1b;4 通道模擬量同步輸出&#xff1b;16 路可編程 I/O&#xff1b;2 路計數器。 USB3150/1/2/5/6 的主要應用場合為&#xff1a;電子產品…

K8s 1.27.1 實戰系列(十)PV PVC

一、核心概念與關系 ?1、PV(Persistent Volume)? PV 是集群中的持久化存儲資源,由管理員預先創建并配置,獨立于 Pod 生命周期。它抽象了底層存儲(如 NFS、云存儲等),定義存儲容量、訪問模式(如 ReadWriteOnce)、回收策略(Retain/Delete/Recycle)等屬性。例如,一…

基于DeepSeek的智能數據分析和自動化處理系統:引領BI行業新變革

近期&#xff0c;一款基于DeepSeek API的智能數據分析和自動化處理系統橫空出世&#xff0c;以其強大的功能和靈活的可擴展性&#xff0c;為BI行業帶來了顛覆性的變革。 該系統支持多類型數據分析&#xff0c;包括文本 、指標和日志等。在文本分析方面&#xff0c;它能夠提取關…