参考:
拉钩高兴训练营笔记
缓存就是内存中的数据,使用缓存,我们可以避免频繁的与数据库进行交互,进而提高响应速度。
mybatis提供一级缓存和二级缓存
①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数
据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相
不影响的
②、二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个
SqlSession可以共用二级缓存,二级缓存是跨SqlSession的
一级缓存
ps: Mybatis 是默认开启一级缓存的。跟Spring结合使用的话执行的方法必须开启事务一级缓存才有效。
关闭/开启
<settings>
<!-- localCacheScope是本地缓存(一级缓存)的作用域,只有两种取值:SESSION和STATEMENT,取STATEMENT意味着关闭一级缓存-->
<setting name="localCacheScope" value="STATEMENT"/>
</settings>
一级缓存清除时机
该会话执行commit操作时
在执行update、insert、delete、flushCache=”true”、commit、rollback、
LocalCacheScope.STATEMENT等情况下,一级缓存就都会被清空。
二级缓存
mapper级别缓存,同表共享
默认关闭二级缓存
开启二级缓存
全局开启: mabatis全局配置文件
<setting name='cacheEnabled' value='true' />
单个mapper开启:
<cache></cache>
二级缓存清除时机
执行更新操作时,commit()
默认关闭二级缓存
二级缓存缺点
无法避免脏数据
什么情况会发生:
一个联表查询语句,同时查询班级,学生信息。保存在班级mapper下,缓存数据
更新学生信息,清空学生mapper下缓存,
再次联表查询,会从班级mapper查询,会从缓存拿到学生的脏数据
解决措施
使用redis,替换mybatis默认二级缓存实现