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

MyBtais的一級(jí)緩存和二級(jí)緩存原理、使用場(chǎng)景解析

 更新時(shí)間:2025年12月10日 09:25:18   作者:SadSunset  
文章總結(jié)了MyBatis的一級(jí)緩存和二級(jí)緩存的工作原理、使用場(chǎng)景和優(yōu)缺點(diǎn),文章還提供了一級(jí)緩存和二級(jí)緩存的對(duì)比表,并總結(jié)了緩存的使用建議,感興趣的朋友跟隨小編一起看看吧

? 一、一級(jí)緩存(Local Cache)—— 默認(rèn)開啟,SqlSession 級(jí)別

?? 是什么?

  • 作用域:同一個(gè) SqlSession 內(nèi)
  • 生命周期:從 openSession()close()commit()/rollback()
  • 默認(rèn)開啟,無需配置

?? 工作原理

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User u1 = mapper.selectById(1); // 發(fā)起 SQL 查詢
    User u2 = mapper.selectById(1); // 不查數(shù)據(jù)庫!直接返回緩存
    System.out.println(u1 == u2); // true(同一個(gè)對(duì)象)
}

? 第二次查詢直接從 SqlSession 內(nèi)部的 HashMap 中返回,不訪問數(shù)據(jù)庫。

?? 什么時(shí)候失效?

  • 執(zhí)行了 INSERT / UPDATE / DELETE(任何寫操作)
  • 調(diào)用了 session.clearCache()
  • session.commit()session.close()

?? 注意:不同 SqlSession 之間不共享一級(jí)緩存。

? 二、二級(jí)緩存(了解即可)(Second-Level Cache)—— Mapper 級(jí)別(跨 SqlSession)

?? 是什么?

  • 作用域:同一個(gè) Mapper namespace 下的所有 SqlSession
  • 生命周期:應(yīng)用級(jí)(只要不清理,一直存在)
  • 默認(rèn)關(guān)閉,需手動(dòng)開啟

?? 如何開啟?

步驟 1:在 MyBatis 主配置中啟用(可選,默認(rèn)已支持)

<settings>
  <setting name="cacheEnabled" value="true"/> <!-- 默認(rèn)就是 true -->
</settings>

步驟 2:在 Mapper XML 中聲明使用緩存

<mapper namespace="com.example.UserMapper">
  <cache /> <!-- 開啟二級(jí)緩存 -->
  <select id="selectById" resultType="User" useCache="true">
    SELECT * FROM user WHERE id = #{id}
  </select>
</mapper>

步驟 3:實(shí)體類必須實(shí)現(xiàn)Serializable

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    // ...
}

?? 工作流程

  1. 第一個(gè) SqlSession 查詢 selectById(1) → 結(jié)果存入二級(jí)緩存
  2. 第二個(gè) SqlSession 查詢 selectById(1) → 直接從二級(jí)緩存讀?。ú徊?DB)
  3. 如果執(zhí)行了 updateUser()整個(gè) UserMapper 的二級(jí)緩存被清空

?? 注意:只要 Mapper 中任意語句執(zhí)行了寫操作,整個(gè) namespace 的緩存都會(huì) flush!

?? 三、大廠為什么不推薦用二級(jí)緩存?

雖然 MyBatis 提供了二級(jí)緩存,但在高并發(fā)、分布式系統(tǒng)中,它問題很多

問題說明
臟讀風(fēng)險(xiǎn)多節(jié)點(diǎn)部署時(shí),A 節(jié)點(diǎn)更新數(shù)據(jù),B 節(jié)點(diǎn)緩存未失效 → 返回舊數(shù)據(jù)
粒度太粗按 Mapper 清緩存,無法精確到某條記錄
序列化開銷對(duì)象要序列化/反序列化,影響性能
調(diào)試?yán)щy緩存導(dǎo)致數(shù)據(jù)“看起來沒更新”,排查成本高

? 大廠替代方案:

  • Redis / Caffeine應(yīng)用級(jí)緩存(可控、分布式安全)
  • 在 Service 層手動(dòng)管理緩存邏輯(如 Spring Cache)
  • 禁用 MyBatis 二級(jí)緩存(Spring Boot 默認(rèn)也不開)

?? 真實(shí)情況:在阿里、字節(jié)等大廠項(xiàng)目中,從未見過生產(chǎn)環(huán)境開啟 MyBatis 二級(jí)緩存

? 四、一級(jí) vs 二級(jí)緩存對(duì)比表

特性一級(jí)緩存二級(jí)緩存
作用域單個(gè) SqlSession同一個(gè) Mapper(namespace)
默認(rèn)開啟? 是? 否
跨 SqlSession? 否? 是
跨 JVM? 否? 否(僅單機(jī)有效)
需要 Serializable? 否? 是
大廠使用建議? 安全可用? 禁止使用

? 五、總結(jié)(背下來)

  • 一級(jí)緩存:MyBatis 自帶,安全、自動(dòng)、無需管,但只在單次會(huì)話內(nèi)有效。
  • 二級(jí)緩存不要用!用 Redis + 手動(dòng)緩存控制才是正道。
  • 緩存不是銀彈:先優(yōu)化 SQL 和索引,再考慮緩存。

如果你在面試中被問到二級(jí)緩存,一定要說:“了解原理,但生產(chǎn)環(huán)境我們用 Redis 替代,避免數(shù)據(jù)不一致問題。” —— 這才是大廠思維!

到此這篇關(guān)于MyBtais的一級(jí)緩存和二級(jí)緩存原理、使用場(chǎng)景解析的文章就介紹到這了,更多相關(guān)mybatis一級(jí)緩存和二級(jí)緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

阿拉善左旗| 出国| 陈巴尔虎旗| 三明市| 会东县| 易门县| 五河县| 南靖县| 日喀则市| 隆尧县| 西乌珠穆沁旗| 德安县| 吉木乃县| 从化市| 邹城市| 南宫市| 司法| 瓮安县| 县级市| 阿尔山市| 汽车| 成武县| 景德镇市| 华安县| 托克托县| 弥勒县| 万年县| 雅安市| 灵石县| 长葛市| 稻城县| 会泽县| 台北市| 博白县| 荔浦县| 宜兰县| 阜阳市| 将乐县| 疏勒县| 阿克陶县| 清远市|