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

深入解析Mybatis中緩存機(jī)制及優(yōu)缺點(diǎn)

 更新時(shí)間:2025年08月29日 11:40:45   作者:青魚入云  
MyBatis緩存分為一級(jí)(SqlSession級(jí),自動(dòng)維護(hù))和二級(jí)(Mapper級(jí),需配置),通過(guò)減少數(shù)據(jù)庫(kù)訪問(wèn)提升性能,但存在臟數(shù)據(jù)和分布式不兼容風(fēng)險(xiǎn),適合高頻查詢低頻修改場(chǎng)景,需合理配置以平衡效率與一致性,本文給介紹Mybatis中緩存機(jī)制及優(yōu)缺點(diǎn),感興趣的朋友跟隨小編一起看看吧

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

一、MyBatis 緩存機(jī)制詳解

1. 一級(jí)緩存(Local Cache)

  • 作用范圍:SqlSession 級(jí)別(即同一個(gè)數(shù)據(jù)庫(kù)會(huì)話內(nèi)有效)。
  • 實(shí)現(xiàn)原理:默認(rèn)開(kāi)啟,無(wú)需配置。MyBatis 在 SqlSession 內(nèi)部維護(hù)一個(gè) HashMap 作為緩存容器,鍵為 CacheKey(由 SQL 語(yǔ)句、參數(shù)、RowBounds、環(huán)境等信息生成),值為查詢結(jié)果。
  • 生命周期:與 SqlSession 一致,當(dāng) SqlSession 關(guān)閉(close())或提交(commit())、回滾(rollback())時(shí),一級(jí)緩存會(huì)被清空。
  • 觸發(fā)場(chǎng)景
  • 同一 SqlSession 中,執(zhí)行相同的查詢(SQL 語(yǔ)句、參數(shù)、分頁(yè)等完全一致),會(huì)直接從緩存獲取結(jié)果,不執(zhí)行 SQL。
  • 若 SqlSession 中執(zhí)行了增刪改操作(insert/update/delete),MyBatis 會(huì)自動(dòng)清空一級(jí)緩存,避免臟數(shù)據(jù)。

2. 二級(jí)緩存(Global Cache)

  • 作用范圍:Mapper 接口級(jí)別(跨 SqlSession 共享,多個(gè) SqlSession 可共享同一 Mapper 的緩存)。
  • 實(shí)現(xiàn)原理:默認(rèn)關(guān)閉,需手動(dòng)開(kāi)啟。開(kāi)啟后,MyBatis 會(huì)為每個(gè) Mapper 接口創(chuàng)建一個(gè)緩存對(duì)象(可自定義緩存實(shí)現(xiàn),如 Redis、EhCache 等),查詢結(jié)果會(huì)先存入一級(jí)緩存,當(dāng) SqlSession 關(guān)閉時(shí),一級(jí)緩存的數(shù)據(jù)會(huì)被刷入二級(jí)緩存。
  • 開(kāi)啟方式
  1. 在 MyBatis 配置文件中開(kāi)啟全局二級(jí)緩存(默認(rèn) true,可省略):
xml
 <settings>
     <setting name="cacheEnabled" value="true"/>
 </settings>
  1. 在 Mapper 接口或 XML 中聲明使用二級(jí)緩存:
 - XML 方式:在 Mapper.xml 中添加 `<cache/>` 標(biāo)簽。
 - 注解方式:在 Mapper 接口上添加 `@CacheNamespace` 注解。
  • 緩存策略:可通過(guò) <cache> 標(biāo)簽的屬性配置,如 eviction(回收策略,如 LRU、FIFO)、flushInterval(自動(dòng)刷新時(shí)間)、size(最大緩存條目)、readOnly(是否只讀)等。
  • 觸發(fā)清空:當(dāng) Mapper 中執(zhí)行增刪改操作時(shí),MyBatis 會(huì)清空該 Mapper 對(duì)應(yīng)的二級(jí)緩存。

3. 緩存執(zhí)行順序

查詢數(shù)據(jù)時(shí),MyBatis 會(huì)按以下順序查找緩存:
二級(jí)緩存 → 一級(jí)緩存 → 數(shù)據(jù)庫(kù)

  • 若二級(jí)緩存命中,直接返回結(jié)果。
  • 若二級(jí)緩存未命中,查詢一級(jí)緩存,命中則返回。
  • 若一級(jí)緩存也未命中,執(zhí)行 SQL 查詢數(shù)據(jù)庫(kù),結(jié)果依次存入一級(jí)緩存和二級(jí)緩存(當(dāng) SqlSession 關(guān)閉時(shí))。

二、MyBatis 緩存的優(yōu)點(diǎn)

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

三、MyBatis 緩存的缺點(diǎn)

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

四、適用場(chǎng)景與最佳實(shí)踐

  • 適合使用緩存
  • 高頻查詢、低頻修改的數(shù)據(jù)(如商品類目、地區(qū)信息、字典表)。
  • 單表查詢或關(guān)聯(lián)關(guān)系簡(jiǎn)單的查詢(避免多表關(guān)聯(lián)導(dǎo)致的緩存不一致)。
  • 分布式環(huán)境下,建議使用 Redis 等分布式緩存替代默認(rèn)二級(jí)緩存。
  • 不適合使用緩存
  • 高頻修改的數(shù)據(jù)(如庫(kù)存、實(shí)時(shí)銷量)。
  • 多表關(guān)聯(lián)復(fù)雜的查詢(難以保證緩存一致性)。
  • 數(shù)據(jù)實(shí)時(shí)性要求極高的場(chǎng)景(如金融交易數(shù)據(jù))。
  • 最佳實(shí)踐
  • 優(yōu)先利用一級(jí)緩存,避免在 SqlSession 中執(zhí)行無(wú)關(guān)操作,減少緩存無(wú)效清空。
  • 二級(jí)緩存按需開(kāi)啟,對(duì)核心 Mapper 單獨(dú)配置,避免全局開(kāi)啟導(dǎo)致的緩存膨脹。
  • 多表關(guān)聯(lián)查詢時(shí),可通過(guò) @CacheNamespaceRef 關(guān)聯(lián)相關(guān) Mapper,確保緩存同步清空。
  • 分布式系統(tǒng)中,集成 Redis 作為二級(jí)緩存,保證緩存一致性。

總結(jié)

MyBatis 緩存機(jī)制通過(guò)一級(jí)緩存和二級(jí)緩存的配合,有效提升了查詢性能,但也存在緩存一致性、分布式兼容等問(wèn)題。實(shí)際使用中需根據(jù)業(yè)務(wù)場(chǎng)景合理配置,權(quán)衡性能與數(shù)據(jù)準(zhǔn)確性,避免濫用緩存導(dǎo)致的隱性問(wèn)題。

到此這篇關(guān)于深入解析Mybatis中緩存機(jī)制及優(yōu)缺點(diǎn)的文章就介紹到這了,更多相關(guān)Mybatis緩存機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • htmlcleaner使用方法及xpath語(yǔ)法初探

    htmlcleaner使用方法及xpath語(yǔ)法初探

    HtmlCleaner是一個(gè)開(kāi)源的Java語(yǔ)言的Html文檔解析器。HtmlCleaner能夠重新整理HTML文檔的每個(gè)元素并生成結(jié)構(gòu)良好(Well-Formed)的 HTML 文檔
    2015-08-08
  • 一文詳解Java抽象類到底有多抽象

    一文詳解Java抽象類到底有多抽象

    這篇文章主要介紹了一文詳解Java抽象類到底有多抽象,抽象方法所在的類必須是抽象類,子類若繼承了一個(gè)抽象類,就必須覆寫父類的所有抽象方法,這里的子類是普通類,是強(qiáng)制要求覆寫所有抽象方法,但是如果子類也是一個(gè)抽象類,那么就可以不覆寫
    2022-06-06
  • MongoDB在Spring Boot中的使用方式舉例介紹

    MongoDB在Spring Boot中的使用方式舉例介紹

    MongoDB是基于Json數(shù)據(jù)結(jié)構(gòu)的非關(guān)系型數(shù)據(jù)庫(kù),每一個(gè)Json文檔有一個(gè)唯一的主鍵,下面通過(guò)實(shí)例代碼講解MongoDB在Spring Boot中的使用方式,感興趣的朋友一起看看吧
    2025-05-05
  • 一起因MySQL時(shí)間戳精度引發(fā)的血案分析

    一起因MySQL時(shí)間戳精度引發(fā)的血案分析

    這篇文章主要給大家介紹了一起因MySQL時(shí)間戳精度引發(fā)的血案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 使用Lombok導(dǎo)致打印的tostring中缺少父類的屬性問(wèn)題

    使用Lombok導(dǎo)致打印的tostring中缺少父類的屬性問(wèn)題

    使用Lombok時(shí),若發(fā)現(xiàn)@Data注解的@ToString不包含父類屬性,可通過(guò)添加@ToString(callSuper=true)解決,此方法確保在生成toString()時(shí)包括父類的屬性,有效解決只打印子類屬性的問(wèn)題,這種做法對(duì)于需要完整信息展示的場(chǎng)景尤為重要
    2024-11-11
  • spring boot設(shè)置過(guò)濾器、監(jiān)聽(tīng)器及攔截器的方法

    spring boot設(shè)置過(guò)濾器、監(jiān)聽(tīng)器及攔截器的方法

    這篇文章主要給大家介紹了關(guān)于spring boot設(shè)置過(guò)濾器、監(jiān)聽(tīng)器及攔截器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot中的yaml語(yǔ)法及靜態(tài)資源訪問(wèn)問(wèn)題

    SpringBoot中的yaml語(yǔ)法及靜態(tài)資源訪問(wèn)問(wèn)題

    這篇文章主要介紹了SpringBoot中的yaml語(yǔ)法及靜態(tài)資源訪問(wèn)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • SpringMVC文件上傳及查看的示例代碼

    SpringMVC文件上傳及查看的示例代碼

    本篇文章主要介紹了SpringMVC文件上傳及查看的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 將JSON字符串?dāng)?shù)組轉(zhuǎn)對(duì)象集合方法步驟

    將JSON字符串?dāng)?shù)組轉(zhuǎn)對(duì)象集合方法步驟

    這篇文章主要給大家介紹了關(guān)于將JSON字符串?dāng)?shù)組轉(zhuǎn)對(duì)象集合的方法步驟,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • SpringBoot四大神器之Auto onfiguration的使用

    SpringBoot四大神器之Auto onfiguration的使用

    本文主要介紹了SpringBoot四大神器之Auto Configuration,springboot auto configuration的本質(zhì)就是自動(dòng)配置spring的各種bean。感興趣的可以了解一下
    2021-10-10

最新評(píng)論

灵璧县| 巨鹿县| 秭归县| 卢龙县| 隆尧县| 厦门市| 裕民县| 襄汾县| 左权县| 镶黄旗| 漳浦县| 东丰县| 射阳县| 漳州市| 宜兰县| 巴里| 从江县| 手游| 孟连| 庆阳市| 出国| 汕头市| 靖西县| 苍梧县| 内黄县| 崇明县| 铁岭市| 玛纳斯县| 南平市| 贡山| 布尔津县| 通州市| 侯马市| 樟树市| 咸阳市| 西平县| 永康市| 安泽县| 二连浩特市| 平罗县| 莫力|