mybatis 缓存

174 阅读1分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

tech.meituan.com/2018/01/19/…

🔹 一级缓存(本地缓存)

一级缓存是本地或者说局部缓存,它不能被关闭,只能配置缓存范围。SESSION 或者 STATEMENT。 设置

mybatis.configuration.local-cache-scope=session

两个特点:

1,同一个session会话 修改操作执行后 一级缓存失效

2,两个session会话不共享缓存 导致会出现脏数据 MyBatis 缓存分为两级

  • 作用范围:默认开启,作用于 SqlSession 级别。

  • 原理:同一个 SqlSession 中执行相同的 SQL(参数一致),第二次会从缓存中取,不再访问数据库。

  • 失效情况

    1. SqlSession 关闭或清空缓存(session.clearCache()
    2. 执行了 insert/update/delete,会清空缓存
    3. 查询参数不同
    4. Mapper 是不同的 SqlSession
    5. 如果Spring Boot 时开启了事务管理(例如使用了 @Transactional),一个事务通常对应一个 SqlSession

🔸 二级缓存(全局缓存)

  • 作用范围:多个 SqlSession 之间共享,基于 namespace

  • 配置方式

    1. 开启全局缓存:<setting name="cacheEnabled" value="true"/>
    2. Mapper 中加 <cache/> 标签开启该 namespace 的缓存
    3. 实体类需实现 Serializable 接口
  • 注意事项

    • 必须是同一个 namespace 下的 SQL 才能共用缓存
    • 默认使用 PerpetualCache(永久缓存)+ LRU 算法 + 同步写入策略
    • 可自定义缓存实现