缓存机制:一二级缓存

一、一级缓存(SqlSession 级缓存)

  1. 开启状态

    • 默认自动开启,无需任何额外配置,也不能通过配置关闭,只能通过操作让其失效
  2. 作用域

    • 作用域为 SqlSession级别 ,缓存数据仅在当前SqlSession内有效,不同SqlSession之间完全隔离
  3. 核心特性

    • 缓存命中条件 :同一SqlSession内,执行SQL 语句 + 参数完全相同的查询,第二次及以后会直接读取缓存,不访问数据库
    • 缓存自动清空场景 :执行insert/update/delete写操作、SqlSession.commit()或SqlSession.rollback()时,一级缓存会被自动清空,保证缓存与数据库数据一致性
    • 手动清空方式 :调用SqlSession.clearCache()方法可手动清空当前SqlSession的一级缓存
    • 序列化要求 :无,一级缓存存储在内存中,仅在SqlSession生命周期内有效,无需实体类实现Serializable接口

二、二级缓存(Mapper 级缓存)

  1. 开启状态

    • 默认关闭 ,需满足三个必要条件才能生效:

      1. 全局配置:settings中cacheEnabled=true(默认值为true,若设为false会全局禁用二级缓存)
      2. Mapper 配置:在对应Mapper.xml中添加<cache/>标签(或使用注解@CacheNamespace)
      3. 实体类要求:对应的实体类必须实现Serializable接口,否则缓存数据无法序列化存储
  2. 作用域

    • 作用域为 Mapper级别 ,按namespace隔离,不同namespace的 Mapper 缓存数据相互独立
    • 同一namespace的多个SqlSession可以共享二级缓存数据
  3. 核心特性

    • 数据写入时机 :二级缓存数据不会即时写入,需等SqlSession关闭后,一级缓存中的数据才会同步到二级缓存
    • 缓存清空规则 :执行insert/update/delete写操作时,当前namespace的二级缓存会被自动清空
    • 共享范围限制 :仅同一namespace的SqlSession可共享,跨namespace无法共享

三、 缓存读写流程

  1. 查询读取顺序(关键易错点)

    • 优先级:二级缓存 → 一级缓存 → 数据库
    • 流程:查询时先从当前namespace的二级缓存获取;未命中则从当前SqlSession的一级缓存获取;仍未命中则查询数据库,查询结果会先写入一级缓存,SqlSession关闭后同步到二级缓存
  2. 数据写入顺序

    • 数据库查询结果 → 一级缓存(即时写入) → 二级缓存(SqlSession关闭后写入)

四、缓存配置

  1. 二级缓存全局配置

    • 在 MyBatis 全局配置文件中,通过settings标签配置cacheEnabled:

      复制代码
      <settings>
          <setting name="cacheEnabled" value="true"/>
      </settings>
    • name属性值为cacheEnabled,value为true表示开启全局二级缓存支持(默认true)

  2. 二级缓存 Mapper 配置

    • 在Mapper.xml中添加<cache/>标签,可配置缓存淘汰策略(eviction)、刷新间隔(flushInterval)等属性

五、缓存设计原则与指标

  1. 缓存命中率

    • 衡量缓存有效性的核心指标,命中率越高,说明更多请求从缓存获取数据,系统性能越好
  2. 缓存的优缺点

    • 优点:降低数据库负载、提高系统响应速度、减少网络 IO 开销
    • 缺点:增加数据一致性风险,需通过缓存清空、过期时间等策略保证缓存与数据库一致
  3. 数据一致性保障

    • 写操作(insert/update/delete)会触发对应缓存的清空,避免脏数据读取

六、一级缓存 vs 二级缓存 核心对比表

对比维度 一级缓存 二级缓存
默认状态 自动开启 默认关闭
作用域 SqlSession 级别 Mapper (namespace) 级别
序列化要求 无 实体类需实现 Serializable
共享范围 仅当前 SqlSession 同一 namespace 的多 SqlSession
写入时机 查询后即时写入 SqlSession 关闭后写入
清空触发条件 写操作、commit/rollback 写操作
相关推荐
SL_staff8 小时前
为什么业务总在等BI报表?JVS-BI的可视化ELT实践解析
spring·数据分析·数据可视化
badhope8 小时前
Spring AI Alibaba停更:Java程序员的信任,还能被辜负几次?
java·spring
云絮.12 小时前
Mybatis(一)
java·数据库·mybatis
垆边人似月.12 小时前
华为题:LRU 缓存
缓存·华为
凤山老林13 小时前
Spring Boot 集成 Spring Modulith:搭一个能拆微服务的模块化单体
spring boot·spring·微服务
泡海椒13 小时前
JQuickExcel 大文件排障与调优:从实际路径定位 OOM、临时盘和慢任务
开发语言·数据库·缓存·oracle·excel
我命由我1234514 小时前
LRU 缓存淘汰策略
数据结构·redis·学习·mysql·算法·缓存·学习方法
十年Java程序媛14 小时前
Redis 分布式锁 + GZIP 压缩缓存踩坑|高并发缓存真实线上复盘
java·开发语言·spring boot·redis·分布式·缓存·面试
小陈phd15 小时前
深入理解agent学习笔记(五)——KV Cache友好的上下文设计
笔记·学习·spring
啦啦啦啦啦zzzz15 小时前
分布式存储----缓存组
linux·服务器·c++·分布式·缓存