深度剖析MyBatis的二級緩存

二級緩存的原理

  • MyBatis 二級緩存的原理是什么?

    1. 二級緩存的原理和一級緩存一樣,第一次查詢會將數據放到 緩存 中,然后第二次查詢直接去緩存讀取。
    2. 但是一級緩存是基于 SqlSession 的,二級緩存是基于 mapper 的 namespace 的。
    3. 也就是說,多個 SqlSession 可以共享同一個二級緩存區域。如果兩個 mapper 的 namespace 相同,那么即使是兩個 mapper,這兩個 mapper 執行 sql 查詢的數據也將保存在相同的二級緩存區域中。

??

如何使用二級緩存

注意:User 需要實現序列化接口。

開啟二級緩存

和一級緩存不一樣,二級緩存需要手動開啟。

首先在全局配置文件 sqlMapConfig.xml 中加入如下代碼

<settings><!-- 開啟二級緩存 --><setting name="cacheEnabled" value="true"/>
</settings>

然后在 UserMapper.xml 中開啟二級緩存。

<!-- 開啟二級緩存 -->
<cache />

如果是使用注解方式,在 IUserMapper? 上寫上注解 @CacheNamespace?

@CacheNamespace
public interface IUserMapper {
}

測試代碼

public class SecondCacheTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void before() throws Exception {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);}@Testpublic void secondLevelCache() {SqlSession sqlSession1 = sqlSessionFactory.openSession();SqlSession sqlSession2 = sqlSessionFactory.openSession();IUserMapper userMapper1 = sqlSession1.getMapper(IUserMapper.class);IUserMapper userMapper2 = sqlSession2.getMapper(IUserMapper.class);User user1 = userMapper1.findUserById(1);// 清空一級緩存sqlSession1.close();User user2 = userMapper2.findUserById(1);System.out.println(user1 == user2);}
}

效果如下

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@56528192]
==>  Preparing: select * from user where id=?
==> Parameters: 1(Integer)
<==    Columns: id, username, password, birthday
<==        Row: 1, lucy, 123, 2019-12-12
<==      Total: 1
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@56528192]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@56528192]
Returned connection 1448247698 to pool.
As you are using functionality that deserializes object streams, it is recommended to define the JEP-290 serial filter. Please refer to https://docs.oracle.com/pls/topic/lookup?ctx=javase15&id=GUID-8296D8E8-2B93-4B9A-856E-0A65AF9B8C66
Cache Hit Ratio [com.terwergreen.mapper.IUserMapper]: 0.5
false

可以看到,兩次請求,只有第一次輸出了 sql , 并且輸出了緩存命中率是 0.5 。

useCache 和 flushCache

  • useCache 用來設置是否禁用二級緩存。在 statement 中設置 useCache="false" 可以禁用當前 select 語句的 二級緩存

  • <select id="selectUserByUserId" useCache="false" resultType="space.terwer.pojo.User"
    parameterType="int">select * from user where id=#{id}
    </select>
    
  • 設置 statement 的 flushCache="true" 即 刷新緩存 ,默認情況下就是 true。因為一般不設置,默認即可

  • 注解方式的使用

    /*** 根據ID查詢用戶** @param id* @return*/
    @Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
    @Select("select * from user where id=#{id}")
    User findUserById(Integer id);
    

文章更新歷史

2024/05/15 同步文章到其他平臺

2022-12-25 feat: 初稿

?

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

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

相關文章

關于API接口的自述

在實際工作中&#xff0c;我們需要經常跟第三方平臺打交道&#xff0c;可能會對接第三方平臺API接口&#xff0c;或者提供API接口給第三方平臺調用。 那么問題來了&#xff0c;如果設計一個優雅的API接口&#xff0c;能夠滿足&#xff1a;安全性、可重復調用、穩定性、好定位問…

Qt運行時,如何設置第一個聚焦的控件

問題&#xff1a;Qt第一個聚焦的控件&#xff0c;如何自行設置&#xff1f; 嘗試&#xff1a; 1.在代碼中設置 lineEdit->setFocus() 。無效&#xff01; 2.Qt Designer–打開form1.ui–菜單欄下一行–Edit Tab Order–按順序點擊–菜單欄下一行–Edit Widgets–退出。無效…

為什么做了功能測試還要做接口測試

接口測試與功能測試不是重復的測試,而是互為補充的測試策略。 在軟件測試領域,接口測試和功能測試被視為質量保證過程中至關重要的組成部分。盡管它們之間存在部分重復,但更多的情況下,它們相輔相成,各自發揮著獨特的作用。本文將探討接口測試與功能測試之間的關系,以及它…

【easyX】動手輕松掌握easyX 1

01 簡單繪圖 在這個程序中&#xff0c;我們先初始化繪圖窗口。其次&#xff0c;簡單繪制兩條線。 #include <graphics.h>//繪圖庫頭文件 #include <stdio.h> int main() {initgraph(640, 480);//初始化640?480繪圖屏幕line(200, 240, 440, 240);//畫線(200,240)…

MySQL是如何選擇索引的?

2.3.5. 索引選擇 MySQL是如何選擇索引的&#xff1f; 優化器決定了具體某一索引的選擇&#xff0c;也就是常說的執行計劃。而優化器的選擇是基于成本&#xff08;cost&#xff09;&#xff0c;哪個索引的成本越低&#xff0c;優先使用哪個索引。 SQL 優化器會分析所有可能的執…

Python操作鼠標鍵盤和爬蟲

一.pyautogui 庫 pyautogui 是一個 Python 庫&#xff0c;允許控制鼠標和鍵盤。可以通過它編寫 Python 腳本來自動執行各種任務&#xff0c;例如點擊按鈕、輸入文本、移動鼠標等。這個庫非常適合用來編寫自動化腳本來完成重復性的工作&#xff0c;比如網頁表單填寫、屏幕截圖、…

STC8增強型單片機開發——定時器Timer

一、定時器 定時器是一種計時裝置&#xff0c;通常由一個晶體振蕩器提供時鐘信號&#xff0c;可以計時一定的時間后執行相應的操作。在單片機中&#xff0c;定時器一般是由計數器和時鐘源組成的&#xff0c;可以用來產生一定時間間隔的中斷信號&#xff0c;或者用于測量輸入信號…

開放式運動耳機哪款好用?五款高性能值得信賴產品推薦

身為戶外運動的達人&#xff0c;我發現開放式運動耳機簡直是咱們運動時的最佳拍檔&#xff0c;不管是跑步還是健身&#xff0c;開放式運動耳機最為舒適&#xff0c;它的妙處就在于不用塞進耳朵&#xff0c;這樣既安全又衛生&#xff0c;戶外動起來更放心。但市面上好壞參半&…

AIGC行業:探索發展風口,把握市場脈搏

AIGC行業現在適合進入嗎 簡介&#xff1a; AIGC行業&#xff1a;探索發展風口&#xff0c;把握市場脈搏 隨著人工智能技術的快速發展&#xff0c;AIGC&#xff08;人工智能生成內容&#xff09;行業正逐漸成為科技界的新寵。在當前的時代背景下&#xff0c;我們不禁要問&…

Chisel中對對<: 和:的理解(其實是Scala中的理解)

在 Scala 語言和 Chisel 硬件構造語言中&#xff0c;<: 和 : 是用于類型注解的兩個不同的符號&#xff0c;它們在泛型編程和類型系統中扮演重要角色。下面是它們各自的意義和用途&#xff1a; <:&#xff08;子類型關系&#xff09; <: 符號在 Scala 中表示子類型關…

Nginx詳細介紹一

Nginx是一個高性能的HTTP和反向代理服務器&#xff0c;它也可以作為郵件服務器使用。 Nginx基本介紹 基本概念&#xff1a; Nginx可以處理大量的并發連接&#xff0c;具有很高的穩定性和低資源消耗的特點。它主要用于Web服務、反向代理、負載均衡和HTTP緩存等場景。 安裝與配…

【半夜學習MySQL】內置函數(含日期、字符串、數學等函數常用用法介紹及示例詳解)

&#x1f3e0;關于專欄&#xff1a;半夜學習MySQL專欄用于記錄MySQL數據相關內容。 &#x1f3af;每天努力一點點&#xff0c;技術變化看得見 文章目錄 日期函數字符串函數數學函數其他函數 日期函數 函數名稱描述current_date()當前日期current_time()當前時間current_time()…

php8.2使用laravel V11.0

報錯&#xff1a;You must enable the openssl extension in your php.ini to load information from https://mirrors.aliyun.com/composer 1、搜索&#xff1a;extension_dir去掉;號 2、搜索&#xff1a;extensionopenssl去掉;號

幻獸帕魯Palworld服務器手動部署

目錄 帕魯官方文檔手動安裝steamcmd通過steamcmd安裝帕魯后端客戶端連接附錄&#xff1a;PalServer.sh的啟動項附錄&#xff1a;配置文件 帕魯官方文檔 https://tech.palworldgame.com/ 手動安裝steamcmd 創建steam用戶 sudo useradd -m steam sudo passwd steam下載steamc…

你寫HTML的時候,會注重語義化嗎?

其實說到語義化&#xff0c;多年前端開發經驗的老手估計也不會太在意&#xff0c;有時候工期太緊&#xff0c;有時候自己疏忽&#xff0c;也就不那么在意了&#xff0c;直接DIVCSS一把梭下去了。 目錄 什么是HTML 什么是HTML語義化 HTML語義化所帶來的好處 我把CSS樣式引入…

_pickle.UnpicklingError: STACK_GLOBAL requires str

導致這個報錯的原因是我跑yolo的時候修改數據集了&#xff0c;里面的label.cache沒有刪除&#xff0c;咱只要刪除掉緩存就行&#xff01;&#xff01; 我這里是已經刪除掉了&#xff0c;所以圖片里面沒有&#xff0c;一般就是在箭頭所示位置有.cache文件的

Vue3知識總結-4

Vue3知識總結-4 文章目錄 Vue3知識總結-4插槽Slots渲染作用域默認內容具名插槽插槽中的數據傳遞具名插槽傳遞數據 組件聲明周期聲明周期示意圖 組件生命周期的應用動態組件組件保持存活組件被卸載 異步組件依賴注入 插槽Slots 在某些場景中&#xff0c;可能想要為子組件傳遞一…

xxljob分片廣播+多線程實現高效定時同步elasticsearch索引庫

需求&#xff1a;為了利用elasticsearch實現高效搜索&#xff0c;需要將mysql中的數據查出來&#xff0c;再定時同步到es里&#xff0c;同時在同步過程中通過分片廣播多線程提高同步數據的效率。 1. 添加映射 使用kibana添加映射 PUT /app_info_article {"mappings&quo…

HL7協議

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 1.介紹2.傳輸協議規范2.1. MLLP2.1.1. 數據頭定義2.1.2. 轉義字符集 2.2. 規范說明2.3. 消息格式說明 3.HL7結構介紹3.1. 患者建檔&#xff08;ADT^A28&#xff09;…

linux c++獲取當前程序的運行路徑

比如我的程序名為:aaa 存放路徑是:/homo/code/ 我在/home/ccc 目錄執行shell文件。shell文件的內容為 #!/bin/bash /homo/code/aaa我希望獲取的路徑是 /homo/code/ 而不是腳本的路徑 給出完整接口代碼 #include <iostream> #include <string> #include <stri…