MyBatis缓存机制:Map;能保存查询出的一些数据;
一级缓存:线程级别的缓存;本地缓存;SqlSession级别的缓存;
二级缓存:全局范围的缓存;除过当前线程;SqlSession能用外其他也可以使用
一级缓存
一级缓存:MyBatis:SqlSesion级别的缓存;默认存在,不需要设置。
机制:只要之前查询过的数据,mybatis就会保存在一个缓存中(Map);下次获取直接从缓存中拿;当前session有效
一级缓存原理观察
一级缓存失效情况
一级缓存失效的几种情况:
- 1、不同的SqlSession对应不同的一级缓存
- 2、同一个SqlSession但是查询条件不同
- 3、同一个SqlSession两次查询期间执行了任何一次增删改操作(mybatis自动清缓存)
方式内容被更新后还保存着老数据
- 4、同一个SqlSession两次查询期间手动清空了缓存openSession.clearCache();
二级缓存
1.应用
二级缓存:namespace级别的缓存;SqlSession关闭或者提交以后有效
一级缓存;SqlSession关闭或者提交以后,一级缓存的数据会放在二级缓存中;
二级缓存的使用:mybatis默认没有使用的;配置步骤;
1)、全局配置开启二级缓存
mybatis-config.xml
<!-- 开启全局缓存开关; -->
<setting name="cacheEnabled" value="true"/>
2)、配置某个dao.xml文件,让其使用二级缓存即可
<cache></cache>
3)、
缓存实现要求指定POJO即JavaBean要求实现Serializable接口
2.二级缓存命中率
DEBUG 09-28 14:22:40,245 Cache Hit Ratio [com.atguigu.dao.TeacherDao]: 0.0
DEBUG 09-28 14:22:40,245 Cache Hit Ratio [com.atguigu.dao.TeacherDao]: 0.5
DEBUG 09-28 14:22:40,245 Cache Hit Ratio [com.atguigu.dao.TeacherDao]: 0.66:
0.0=0/1
0.5=1/2 第二次查到
0.66=2/3 第三次查到
0.5=2/4 第四次没查到
…
分母代表第几次尝试去二级缓存中取数据
分子代表取中了几次
Mybatis缓存之缓存查询顺序
1. 不会出现一级缓存和二级缓存中有同一个数据。因为二级缓存是在一级缓存关闭之后才有的
2.任何时候都是先看二级缓存、再看一级缓存,如果大家都没有就去查询数据库,数据库的查询后的结果放在一级缓存中了;
【口诀】二 == 一 == 库
Mybatis之缓存原理
所谓二级缓存是名称空间级别的缓存,什么意思呢?
TeacherDao.xml首行
<mapper namespace="com.atguigu.dao.TeacherDao">就是这个意思
缓存原理:
Mybatis缓存之整合第三方缓存
为什么要用第三方缓存?因为mybatis的缓存机制说白了就是一个map,不够强大。但幸好mybatis有自知之明将其Cache做成了一个接口开放出来,我们可以实现这个接口用第三方专业的缓存框架去自定义
MyBatis;---Cache;
整合ehcache;ehcache非常专业的java进程内的缓存框架;
1、导包
ehcache-core-2.6.8.jar(ehcache核心包)
mybatis-ehcache-1.0.3.jar(ehcache的整合包,导了这个包我们连自己实现Cache都不用自己写了这个包的思想跟我们是一样的EhcacheCache implements org.apache.ibatis.cache.Cache)
slf4j-api-1.7.21.jar
slf4j-log4j12-1.7.21.jar
2、ehcache要工作有一个配置文件;
文件名叫ehcache.xml;放在类路径的根目录下(官方的复制过来)
3、在Dao.xml或者说是mapper.xml一个意思中配置使用自定义的缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
4、若别的dao还要用这个同一块缓存;缓存引用cache-ref
比如跟别的Dao(TeacherDao)公用一块缓存
<!-- 和别的dao共用一块缓存-->
<cache-ref namespace="com.atguigu.dao.TeacherDao"/>