【mybatis3】一级缓存和二级缓存
发布日期:2021-05-08 11:07:20 浏览次数:20 分类:精选文章

本文共 993 字,大约阅读时间需要 3 分钟。

MyBatis 缓存机制详解

一级缓存

1.1 一级缓存简介

MyBatis 的一级缓存默认开启,仅适用于同一个 SqlSession,因此也称为 SqlSession 级别缓存。它用于缓存多次执行相同 SQL 语句的结果,避免重复数据库查询。

1.2 一级缓存失效情况

一级缓存在以下情况下会失效:

  • 多个 SqlSession 开启:每个 SqlSession 都有自己的缓存,多个会话会导致缓存失效。
  • 入参不一致:即使使用同一个 SqlSession,参数变化也会导致缓存失效。
  • 数据库修改:一次修改操作后,再次查询相同 SQL 语句会失效。
  • 手动清空缓存:调用 sqlSession.clearCache() 也会清空一级缓存。

1.3 一级缓存机制

一级缓存使用 PerpetualCache 实现,采用 HashMap 存储。缓存键由 sqlId 和解析后的 SQL 语句组成。查询完成后立即存入缓存,与事务无关。

二级缓存

2.1 二级缓存简介

二级缓存是全局缓存,默认关闭,需手动配置。它跨 SqlSession,适用于多个会话共享数据。缓存存储实体类,需实现 Serializable 接口。

2.2 二级缓存配置

  • 全局开关:配置 cacheEnabledtrue,默认开启。
  • 缓存标签:在 mapper 文件中使用 <cache> 标签,指定要缓存的 SQL。
  • 实体类:确保实体类实现 Serializable

2.3 二级缓存属性

  • 回收策略:默认 LRU(最近最少使用)。
  • 刷新间隔:默认 1 小时,定期清空缓存。
  • 最大引用数:设定缓存大小,避免内存溢出。
  • 只读模式:可选 readonly 属性,控制缓存可写性。

2.4 二级缓存失效情况

  • 增删改操作:触发缓存失效,需设置 flushCache="false" 避免。
  • 禁用缓存:通过 useCache="false" 禁用某些查询加入缓存。
  • 关联清空:使用 <cache-ref> 关联其他命名空间的缓存清空。

2.5 二级缓存应用场景

  • 频率高但频率低的查询:适合时间敏感但稳定数据。
  • 分布式环境:结合 Redis 等分布式缓存,提升性能。

总结

MyBatis 的一级和二级缓存均提供了缓存机制,适用于不同场景。一级缓存适合单会话,二级缓存适合多会话。合理配置可提升性能,但需注意数据一致性和脏读问题。

上一篇:【mybatis3】调试/断点打印日志
下一篇:【mybatis】架构实现原理--2 mybatis的几种写法

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月15日 12时11分52秒