缓存机制:一二级缓存

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

  1. 开启状态

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

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

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

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

  1. 开启状态

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

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

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

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

三、 缓存读写流程

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

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

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

四、缓存配置

  1. 二级缓存全局配置

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

      复制代码
      <settings>
          <setting name="cacheEnabled" value="true"/>
      </settings>
    • name属性值为cacheEnabledvaluetrue表示开启全局二级缓存支持(默认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 写操作
相关推荐
用户31268748772021 小时前
Spring Boot 异常处理到底怎么玩的?从 DispatcherServlet 到全局兜底的全链路拆解
spring
不才不才不不才21 小时前
Spring 源码系列(17): HandlerMapping 与 HandlerAdapter 两大体系
java·后端·spring
(轻舟已过万重山)1 天前
第40章 Spring AI 实战:企业级 AI 应用架构
人工智能·spring·架构
vHelios1 天前
【电商项目】商品服务模块的问题解决与代码逻辑思考
java·sql·mybatis
范什么特西1 天前
回答知识总结04(redis)
数据库·redis·缓存
敲个大西瓜1 天前
Mybatis核心面试题
mybatis
math_hongfan2 天前
鸿蒙离线数据缓存高级架构:弱网预加载/离线数据优先级/同步冲突解决/上线后数据合并策略
学习·缓存·华为·架构·harmonyos·鸿蒙
堕落年代2 天前
Ollama CPU 推理大提示词优化实测报告(细致化数据版)
java·后端·spring
cfm_29142 天前
基于OAuth2.0实现微服务SSO单点登录
后端·spring·微服务·架构
攻城有术2 天前
专项攻克-springcloud及其组件
后端·spring·spring cloud