【串线篇】Mybatis缓存原理

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"/>

 

 

 

 

原文地址:https://www.cnblogs.com/yanl55555/p/11936736.html