最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis SqlSession 與緩存機制實例詳解

 更新時間:2026年06月01日 10:06:41   作者:驕馬之死  
Spring整合MyBatis中的SqlSession管理機制與緩存策略,詳細(xì)解析了SqlSession綁定線程、事務(wù)的原理,以及一級、二級緩存的工作機制與配置方法,感興趣的朋友跟隨小編一起看看吧

一、Spring 管理下的 SqlSession 核心機制

Spring 會將 SqlSession當(dāng)前線程事務(wù)進(jìn)行強綁定,這是 MyBatis 整合 Spring 后最核心的運行機制,保證了事務(wù)一致性與線程安全。

1. 完整生命周期流程

  • 事務(wù)開啟階段
    • Spring 會檢查當(dāng)前線程是否已綁定 SqlSession,若不存在,則創(chuàng)建 SqlSession 并綁定到 ThreadLocal 中,實現(xiàn)線程隔離。
  • SQL 執(zhí)行階段
    • 所有 Mapper 接口都會通過當(dāng)前線程綁定的 SqlSession 訪問數(shù)據(jù)庫,保證同一事務(wù)內(nèi)使用同一個連接和會話。
  • 事務(wù)/請求結(jié)束階段
    • Spring 事務(wù)管理器自動觸發(fā) closeSqlSession 邏輯
    • 清空 MyBatis 一級緩存
    • 釋放數(shù)據(jù)庫連接(Connection)并歸還連接池
    • 解除綁定:將 SqlSession 從當(dāng)前線程的 ThreadLocal 中移除

2. Mapper 調(diào)用底層原理(以userMapper.selectById(1)為例)

Mapper 接口本身沒有實現(xiàn)類,底層是 JDK 動態(tài)代理對象,所有調(diào)用最終都會交給 SqlSession 執(zhí)行。

核心代碼示意

// 1. 獲取 SqlSession
SqlSession session = sqlSessionFactory.openSession();
// 2. 通過 SqlSession 創(chuàng)建 Mapper 代理對象
UserMapper mapper = session.getMapper(UserMapper.class);
// 3. 本質(zhì):調(diào)用 SqlSession 的 selectOne 等方法
mapper.selectById(1);

3. Spring 整合后的詳細(xì)執(zhí)行流程

第一步:事務(wù)前置準(zhǔn)備

Spring 事務(wù)攔截器 TransactionInterceptor 優(yōu)先執(zhí)行:

  1. 通過事務(wù)管理器 PlatformTransactionManager 獲取數(shù)據(jù)庫連接
  2. 將連接存入 TransactionSynchronizationManager(底層基于 ThreadLocal)
  3. 注意:此階段僅準(zhǔn)備數(shù)據(jù)庫連接,SqlSession 尚未創(chuàng)建

第二步:執(zhí)行 Mapper 方法(SqlSession 創(chuàng)建時機)

當(dāng)代碼執(zhí)行到 userMapper.selectById(1) 時:

  1. 進(jìn)入 Mapper 動態(tài)代理對象,調(diào)用 SqlSessionTemplate
  2. SqlSessionTemplate 委托 SqlSessionUtils 獲取當(dāng)前會話
  3. 復(fù)用/創(chuàng)建規(guī)則
    • 線程已有 SqlSession → 直接復(fù)用
    • 無線程會話 → 創(chuàng)建新 SqlSession,并綁定到當(dāng)前 Spring 事務(wù)上下文

4. 非事務(wù)環(huán)境的問題

如果未開啟 Spring 事務(wù),執(zhí)行邏輯會發(fā)生變化:

  • 每執(zhí)行一個 Mapper 方法,Spring 都會創(chuàng)建一個臨時 SqlSession
  • 方法執(zhí)行完畢后立即關(guān)閉會話
  • 后果:一級緩存完全失效,多次相同查詢會重復(fù)訪問數(shù)據(jù)庫,性能下降,且無法保證查詢結(jié)果的數(shù)據(jù)一致性

二、MyBatis 一級緩存

核心定義

一級緩存是 SqlSession 級別的緩存,屬于默認(rèn)開啟、無法關(guān)閉的本地緩存。

工作機制

同一個 SqlSession 內(nèi),執(zhí)行完全相同的 SQL、參數(shù)時:

  1. 第一次查詢 → 訪問數(shù)據(jù)庫,并將結(jié)果存入一級緩存
  2. 后續(xù)相同查詢 → 直接從內(nèi)存讀取,不再請求數(shù)據(jù)庫
  3. 會話提交/關(guān)閉/執(zhí)行增刪改操作 → 緩存自動清空

適用場景

單次請求、單次事務(wù)內(nèi)的重復(fù)查詢優(yōu)化。

三、MyBatis 二級緩存

核心定義

二級緩存是 Mapper(Namespace)級別的緩存,跨 SqlSession 共享,多個線程/會話可以訪問同一份緩存數(shù)據(jù)。

工作機制

  1. 當(dāng) SqlSession 提交或關(guān)閉時,會將一級緩存的數(shù)據(jù)同步到二級緩存
  2. 其他 SqlSession 執(zhí)行相同 Mapper 的相同查詢時,優(yōu)先查詢二級緩存
  3. 執(zhí)行增刪改操作 → 該 Namespace 下的二級緩存自動清空

開啟方式

  • 全局配置(默認(rèn)已開啟)
  • mybatis-config.xml 中啟用緩存開關(guān):
  • <setting name="cacheEnabled" value="true"/>
  • Mapper 配置
  • 在對應(yīng)的 Mapper.xml 文件中添加緩存標(biāo)簽:
  • <cache/>
  • 實體類要求
  • 緩存的 POJO 實體類必須實現(xiàn) Serializable 序列化接口(二級緩存支持持久化到磁盤、Redis 等存儲介質(zhì))。

總結(jié)

  1. SqlSession:由 Spring 托管,與線程、事務(wù)綁定,保證同一事務(wù)內(nèi)會話唯一,非事務(wù)環(huán)境會導(dǎo)致會話頻繁創(chuàng)建銷毀、一級緩存失效。
  2. 一級緩存:SqlSession 級別,默認(rèn)開啟,會話內(nèi)共享,會話關(guān)閉即清空。
  3. 二級緩存:Mapper 級別,跨會話共享,需手動開啟,支持分布式/持久化存儲,適用于讀多寫少的場景。

到此這篇關(guān)于MyBatis SqlSession 與緩存機制詳解的文章就介紹到這了,更多相關(guān)MyBatis SqlSession 緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程池的拒絕策略實現(xiàn)詳解

    Java線程池的拒絕策略實現(xiàn)詳解

    這篇文章主要介紹了Java線程池的拒絕策略實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 基于maven中多個子模塊的構(gòu)建順序

    基于maven中多個子模塊的構(gòu)建順序

    這篇文章主要介紹了maven中多個子模塊的構(gòu)建順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • spring boot整合mybatis+mybatis-plus的示例代碼

    spring boot整合mybatis+mybatis-plus的示例代碼

    這篇文章主要介紹了spring boot整合mybatis+mybatis-plus的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringBoot2.動態(tài)@Value的實現(xiàn)方式

    SpringBoot2.動態(tài)@Value的實現(xiàn)方式

    這篇文章主要介紹了SpringBoot2.動態(tài)@Value的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java多線程中的Interrupt簡析

    Java多線程中的Interrupt簡析

    這篇文章主要介紹了Java多線程中的Interrupt簡析,Interrupt 的其作用是"中斷"線程, 但實際上線程仍會繼續(xù)運行, 這是一個非常容易混淆的概念,Interrupt 的真正作用是給線程對象設(shè)置一個中斷標(biāo)記, 并不會影響線程的正常運行,需要的朋友可以參考下
    2023-09-09
  • 詳解Java的設(shè)計模式編程中的原型模式

    詳解Java的設(shè)計模式編程中的原型模式

    這篇文章主要介紹了Java的設(shè)計模式編程中的原型模式,處理對象復(fù)制時要特別注意淺拷貝和深拷貝的問題,需要的朋友可以參考下
    2016-02-02
  • SpringCloud整合Nacos實現(xiàn)流程詳解

    SpringCloud整合Nacos實現(xiàn)流程詳解

    這篇文章主要介紹了SpringCloud整合Nacos實現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • springboot項目用maven插件打包時報錯的解決方法

    springboot項目用maven插件打包時報錯的解決方法

    文章介紹了解決Spring Boot項目使用Maven插件打包時遇到JDK版本無效問題的步驟,本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Spring中的BeanFactory與FactoryBean區(qū)別詳解

    Spring中的BeanFactory與FactoryBean區(qū)別詳解

    這篇文章主要介紹了Spring中的BeanFactory與FactoryBean區(qū)別詳解,BeanFactory是一個接口,它是spring中的一個工廠,FactoryBean也是一個接口,實現(xiàn)了3個方法,通過重寫其中方法自定義生成bean,需要的朋友可以參考下
    2024-01-01
  • java中Websocket的使用方法例子

    java中Websocket的使用方法例子

    這篇文章主要給大家介紹了關(guān)于java中Websocket的使用方法,WebSocket是HTML5開始提供的一種在瀏覽器和服務(wù)器間進(jìn)行全雙工通信的協(xié)議,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11

最新評論

昌吉市| 鄯善县| 四会市| 凌海市| 崇州市| 南川市| 剑阁县| 昭平县| 吐鲁番市| 芦溪县| 锡林浩特市| 蒙山县| 合川市| 威宁| 新乐市| 米脂县| 竹溪县| 鸡泽县| 东山县| 石嘴山市| 淳安县| 台南县| 光山县| 阜新市| 海城市| 交口县| 石城县| 彭泽县| 高碑店市| 年辖:市辖区| 吴忠市| 无棣县| 武邑县| 丹凤县| 镶黄旗| 西乡县| 延川县| 于田县| 闽清县| 漠河县| 伊通|