参考:
拉钩高兴训练营笔记

缓存就是内存中的数据,使用缓存,我们可以避免频繁的与数据库进行交互,进而提高响应速度。

mybatis提供一级缓存和二级缓存

image.png

①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数
据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相
不影响的
②、二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个
SqlSession可以共用二级缓存,二级缓存是跨SqlSession的

一级缓存

ps: Mybatis 是默认开启一级缓存的。跟Spring结合使用的话执行的方法必须开启事务一级缓存才有效。
关闭/开启

  1. <settings>
  2. <!-- localCacheScope是本地缓存(一级缓存)的作用域,只有两种取值:SESSIONSTATEMENT,取STATEMENT意味着关闭一级缓存-->
  3. <setting name="localCacheScope" value="STATEMENT"/>
  4. </settings>

一级缓存清除时机
该会话执行commit操作时
在执行update、insert、delete、flushCache=”true”、commit、rollback、
LocalCacheScope.STATEMENT等情况下,一级缓存就都会被清空。

二级缓存

mapper级别缓存,同表共享
默认关闭二级缓存

开启二级缓存
全局开启: mabatis全局配置文件

  1. <setting name='cacheEnabled' value='true' />

单个mapper开启:

  1. <cache></cache>

二级缓存清除时机
执行更新操作时,commit()
默认关闭二级缓存

二级缓存缺点
无法避免脏数据

什么情况会发生:
一个联表查询语句,同时查询班级,学生信息。保存在班级mapper下,缓存数据
更新学生信息,清空学生mapper下缓存,
再次联表查询,会从班级mapper查询,会从缓存拿到学生的脏数据

解决措施
使用redis,替换mybatis默认二级缓存实现