MyBatis中关于缓存的理解

MyBatis缓存

  • MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存
    • 默认情况下,只有一级缓存开启(sqlSession级别的缓存)
    • 二级缓存需要手动开启配置,需要局域namespace级别的缓存

一级缓存(本地缓存)

  • 与数据库同一次会话期间查询到的数据会放入本地缓存当中
  • 如果以后需要获取相同的数据直接去缓存当中拿,没必要再去查询数据库

一级缓存失效的4种情况

  1. sqlSession不同
  2. sqlSession相同,查询条件不同
  3. sqlSession相同,两次查询之间执行了增删改操作
  4. sqlSession相同,手动清除一级缓存(session.close())

二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建SqlSession查询结果会被缓存;此后若再次执行相同的查询语句,结果会从一个缓存中获取

二级缓存开启的条件

  1. 在核心配置文件中,设置全局属性caheEnable="true"
  2. 在映射件中置<Cache>
  3. 查询数据所转换的实体类类型必须实现序列化接口(序列化之后的数据存储不是对象,而是以数据的形式进行缓存)
  4. 二级缓存必须在SqlSession关闭或提交之后有效

Mybatis缓存查询顺序

  1. 先查询二级缓存,因为二级缓存中可能会有其他程序查询出来的数据,可以直接拿来使用

  2. 如果二级缓存未命中,再查询一级缓存

  3. 如果一级缓存也没有命中,则查询数据库

  4. SqlSession关闭之后,一级缓存的数据会写入二级缓存

相关推荐
wuminyu7 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
callJJ9 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
wbs_scy9 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jinanwuhuaguo11 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
倒霉蛋小马11 小时前
【Redis】什么是缓存穿透?
缓存
xmjd msup11 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
9523612 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.12 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-194312 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心122112 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4