Mybatis的一级缓存和二级缓存

由于在最近的面试中,多次被问到Mybatis的一级缓存和二级缓存,因此在此进行总结,文章中的代码截图和最后的缓存执行顺序图摘抄自B站up主“狂神说”的Mybatis视频讲解,以下附上视频链接:https://www.bilibili.com/video/BV1NE411Q7Nx?p=26

【一】Mybatis的一级缓存和二级缓存
  1. 一级缓存: SqlSession级别,也叫本地缓存,默认开启,只要在同一个SqlSession中,执行相同的查询语句,并且查的是同一个mapper.xml文件,那么会走一级缓存,SqlSession会话关闭的话,一级缓存就失效了
    Mybatis的一级缓存和二级缓存_第1张图片

上面的例子中,由于查询的都是id为1的用户,执行的sql语句也是一模一样的,并且是在同一个SqlSession中执行的,那么会走缓存
Mybatis的一级缓存和二级缓存_第2张图片
上面的例子中,第二次查询id为1的用户是不走缓存的,因为增删改操作都会导致缓存失效,即使改的数据跟我们查的数据无关

一级缓存失效的情况:

  • 查询不同的东西(sql语句必须一模一样才会走缓存)
  • 增删改操作
  • 查询不同的Mapper.xml
  • 手动清理缓存(sqlsession.clearCache())
  • SqlSession会话连接关闭
  1. 二级缓存: 由于一级缓存作用域太低了,所以诞生了二级缓存,二级缓存是基于namespace级别的缓存,也就是一个命名空间,或者叫一个mapper.xml文件,对应一个二级缓存;开启二级缓存只需要在对应的mapper.xml文件声明一个 标签
    Mybatis的一级缓存和二级缓存_第3张图片
    上面这个例子应该是不走缓存的,虽然我们开启了二级缓存,但是由于二级缓存的工作机制是:SqlSession关闭时,一级缓存失效,才会将一级缓存中的东西放到二级缓存中,上面的例子由于sqlSession2执行查询的时候,sqlSession还未关闭,所以二级缓存中没有对应的缓存信息
    Mybatis的一级缓存和二级缓存_第4张图片
    如果是这个执行顺序的话,那么就会走缓存了

二级缓存小结: 只要开启了二级缓存,在同一个Mapper.xml文件下就能生效;所有的数据都会先放在一级缓存中,只有当会话提交,或者会话关闭的时候,才会提交到二级缓存中

  1. 缓存的执行顺序
    Mybatis的一级缓存和二级缓存_第5张图片

你可能感兴趣的:(框架,Mybatis,一级缓存,二级缓存)