MyBatis一級緩存和二級緩存

介紹

在開發基于 MyBatis 的應用時,緩存是提升性能的關鍵因素之一。MyBatis 提供了一級緩存和二級緩存,合理使用它們可以顯著減少數據庫的訪問次數,提高系統的響應速度和吞吐量。本文將深入探討 MyBatis 一級緩存和二級緩存的工作原理、使用方式以及注意事項。

一級緩存

概念

一級緩存是 MyBatis 中最基本的緩存,它是基于?SqlSession?的。也就是說,在同一個?SqlSession?中,執行相同的 SQL 查詢時,MyBatis 會優先從一級緩存中獲取數據,而不是再次訪問數據庫。

工作原理

當執行一個查詢語句時,MyBatis 會先根據 SQL 語句和參數生成一個唯一的緩存鍵,然后檢查一級緩存中是否存在該緩存鍵對應的數據。如果存在,則直接返回緩存中的數據;如果不存在,則執行 SQL 查詢,并將查詢結果存入一級緩存中,以便后續使用。

緩存失效情況

  • SqlSession?關閉:當?SqlSession?關閉時,一級緩存會被清空。
  • 執行增刪改操作:在同一個?SqlSession?中執行增刪改操作后,一級緩存會被清空,以確保數據的一致性。

二級緩存

概念

二級緩存是基于?SqlSessionFactory?的,它的作用范圍更廣。多個?SqlSession?可以共享二級緩存,只要它們是由同一個?SqlSessionFactory?創建的。

工作原理

二級緩存的工作原理與一級緩存類似,但它的生命周期更長。當一個?SqlSession?執行查詢時,如果二級緩存中存在該查詢結果,則直接返回;如果不存在,則執行查詢,并將結果存入二級緩存中。

配置和使用

1. 開啟二級緩存

在?mybatis-config.xml?中添加以下配置:

<settings><setting name="cacheEnabled" value="true"/>
</settings>

?

2. 在映射文件中啟用緩存

在?UserMapper.xml?中添加?<cache>?標簽:

<mapper namespace="com.example.UserMapper"><cache/><select id="selectUserById" parameterType="int" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>

?

緩存失效情況

  • 執行增刪改操作:在任何?SqlSession?中執行增刪改操作后,二級緩存中相關的數據會被清空,以確保數據的一致性。

一級緩存與二級緩存的比較

比較項一級緩存二級緩存
作用范圍同一個?SqlSession同一個?SqlSessionFactory?下的所有?SqlSession
生命周期與?SqlSession?相同與?SqlSessionFactory?相同
數據共享不共享共享
緩存清空時機SqlSession?關閉或執行增刪改操作執行增刪改操作

注意事項

  • 數據一致性:由于緩存的存在,可能會導致數據不一致的問題。在使用緩存時,需要確保在數據發生變化時及時清空緩存。
  • 緩存大小:需要合理設置緩存的大小,避免緩存占用過多的內存。
  • 序列化:二級緩存中的對象需要實現?Serializable?接口,因為緩存可能會將對象序列化后存儲。

總結

MyBatis 的一級緩存和二級緩存是提升應用性能的重要手段。一級緩存適用于在同一個?SqlSession?中多次執行相同查詢的場景,而二級緩存適用于多個?SqlSession?共享數據的場景。在使用時,需要根據具體的業務需求和數據特點,合理配置和使用緩存,以確保數據的一致性和系統的性能。

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

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

相關文章

C++核心語法快速整理

前言 歡迎來到我的博客 個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客 本文主要為學過多門語言玩家快速入門C 沒有基礎的就放棄吧。 全部都是精華&#xff0c;看完能直接上手改別人的項目。 輸出內容 std::代表了這里的cout使用的標準庫&#xff0c;避免不同庫中的相同命名導致混亂 …

如何讓自動駕駛汽車“看清”世界?坐標映射與數據融合概述

在自動駕駛領域,多傳感器融合技術是實現車輛環境感知和決策控制的關鍵。其中,坐標系映射和對應是多傳感器融合的重要環節,它涉及到不同傳感器數據在統一坐標系下的轉換和匹配,以實現對車輛周圍環境的準確感知。本文將介紹多傳感器融合中坐標系映射和對應的數學基礎和實際應…

Unity Shader 的編程流程和結構

Unity Shader 的編程流程和結構 Unity Shader 的編程主要由以下三個核心部分組成&#xff1a;Properties&#xff08;屬性&#xff09;、SubShader&#xff08;子著色器&#xff09; 和 Fallback&#xff08;回退&#xff09;。下面是它們的具體作用和結構&#xff1a; 1. Pr…

第十四天- 排序

一、排序的基本概念 排序是計算機科學中一項重要的操作&#xff0c;它將一組數據元素按照特定的順序&#xff08;如升序或降序&#xff09;重新排列。排序算法的性能通常通過時間復雜度和空間復雜度來衡量。在 Python 中&#xff0c;有內置的排序函數&#xff0c;同時也可以手…

移除idea External Liraries 中maven依賴包

問題背景 擴展包里面不停的出現已經在POM文件注釋的包&#xff0c;其實是沒有查詢到根源位置。 在IDEA插件中搜索Maven Helper 點擊pom.xml文件 會出現擴展插件 定位之后在pom中添加exclusions&#xff0c;如下代碼 <dependency><groupId>com.disney.eva.framewo…

AI革命!藍耘攜手海螺AI視頻,打造智能化視頻新紀元

AI革命&#xff01;藍耘攜手海螺AI視頻&#xff0c;打造智能化視頻新紀元 前言 在這個信息爆炸的時代&#xff0c;視頻已經成為我們獲取信息、學習新知識的重要方式。而隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;AI與視頻內容的結合為我們帶來了全新的…

dify1.1.1安裝

1、 按照GitHub上操作 下載源碼&#xff0c;沒有安裝git的&#xff0c;可以下載成zip包&#xff0c; unzip 解壓 git clone https://github.com/langgenius/dify.git cd dify cd docker cp .env.example .env2、啟動前 &#xff0c;先改下 docker-compose.yaml&#xff0c;…

ElasticSearch 可觀測性最佳實踐

ElasticSearch 概述 ElasticSearch 是一個開源的高擴展的分布式全文檢索引擎&#xff0c;它可以近乎實時的存儲、檢索數據&#xff1b;本身擴展性很好&#xff0c;可以擴展到上百臺服務器&#xff0c;處理 PB 級別&#xff08;大數據時代&#xff09;的數據。ES 也使用 Java 開…

Excel處理控件Spire.XLS系列教程:C# 在 Excel 中添加或刪除單元格邊框

單元格邊框是指在單元格或單元格區域周圍添加的線條。它們可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引讀者注意重要的單元格或使工作表看起來更美觀。本文將介紹如何使用 Spire.XLS for .NET 在 C# 中添加或刪除 Excel 單元格邊框。 安裝 Spire.XLS for .NET E-…

前端Wind CSS面試題及參考答案

目錄 標準盒模型與 IE 盒模型的區別是什么?如何通過 box-sizing 屬性切換這兩種盒模型? 如何計算一個元素在標準盒模型下的總寬度(包含 margin、padding、border)? 父元素高度塌陷的原因是什么?請列舉至少 3 種清除浮動的方法。 方法一:使用 clear 屬性 方法二:使用…

基于 ECharts 實現動態圖表渲染支持10萬+數據點實時更新方案

引言 實現支持10萬數據點實時更新的動態圖表渲染確實具有挑戰性&#xff0c;尤其是在性能和用戶體驗方面。以下是一些關鍵點和應用場景&#xff1a; 關鍵挑戰 性能優化&#xff1a; 渲染性能&#xff1a;大量數據點會導致瀏覽器渲染壓力大&#xff0c;可能引發卡頓。數據處理…

裝飾器模式 (Decorator Pattern)

裝飾器模式 (Decorator Pattern) 是一種結構型設計模式,它動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾器模式相比生成子類更為靈活。 一、基礎 1 意圖 動態地給一個對象添加一些額外的職責。 就增加功能來說,裝飾器模式相比生成子類更為靈活。 2 適用場景 當…

【Java】TCP網絡編程:從可靠傳輸到Socket實戰

活動發起人小虛竹 想對你說&#xff1a; 這是一個以寫作博客為目的的創作活動&#xff0c;旨在鼓勵大學生博主們挖掘自己的創作潛能&#xff0c;展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴&#xff0c;那么&#xff0c;快來參加吧&#xff01…

藍橋杯C++基礎算法-0-1背包

這段代碼實現了一個經典的0-1 背包問題的動態規劃解法。0-1 背包問題是指給定一組物品&#xff0c;每個物品有其體積和價值&#xff0c;要求在不超過背包容量的情況下&#xff0c;選擇物品使得總價值最大。以下是代碼的詳細思路解析&#xff1a; 1. 問題背景 給定 n 個物品&am…

html5炫酷的科技感3D文字效果實現詳解

炫酷的科技感3D文字效果實現詳解 這里寫目錄標題 炫酷的科技感3D文字效果實現詳解項目概述核心技術實現1. 3D文字效果2. 故障藝術效果&#xff08;Glitch Effect&#xff09;3. 動態網格背景4. 掃描線效果5. 粒子效果 性能優化考慮技術難點與解決方案項目總結擴展優化方向 項目…

車道保持中車道線識別

需要讓小車保持車道行駛&#xff0c;首先需要進行車道線識別。 也可參看論文&#xff08;上傳到資源里&#xff09;&#xff1a;自動駕駛汽車車道檢測與預測的技術解析-基于圖像處理和Hough變換的方法 1 車道識別流程 想進行車道線識別&#xff0c;并且希望在圖像中選擇一個特…

英偉達有哪些支持AI繪畫的 工程

英偉達在AI繪畫領域布局廣泛&#xff0c;其自研工具與第三方合作項目共同構建了完整的技術生態。以下是其核心支持AI繪畫的工程及合作項目的詳細介紹&#xff1a; 一、英偉達自研AI繪畫工具 1. GauGAN系列 技術特點&#xff1a;基于生成對抗網絡&#xff08;GAN&#xff09;&…

驅動開發的引入

1.引入 Linux內核的整體架構本就非常龐大&#xff0c;其包含的組件也非常多。而我們怎樣把需要的部分都包含在內核中呢? 一種方法是把所有需要的功能都編譯到Linux內核中。這會導致兩個問題&#xff0c;一是生成的內核會很大&#xff0c;二是如果我們要在現有的內核中新增或刪…

AI日報 - 2025年3月24日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Lyra生物序列建模架構效率驚人 在100生物任務中達最優&#xff0c;推理速度提升高達12萬倍 ▎&#x1f4bc; 商業動向 | OpenAI用戶破4億&#xff0c;Meta與Reliance探討AI合作 生態擴展與全…

VMware上對CentOS7虛擬機進行磁盤擴容、縮容

在VMware 17 Pro上對CentOS 7虛擬機進行磁盤擴容&#xff0c;同時保證原先部署的軟件正常使用&#xff0c;可以按照以下步驟進行操作&#xff1a; 一、擴容 步驟一&#xff1a;關閉虛擬機并在VMware中擴展磁盤容量 關閉虛擬機&#xff1a;在VMware Workstation 17 Pro中&…