mybatis的缓存分为两种 一级缓存和二级缓存
一级缓存是基于sqlSession级别的缓存 二级缓存是基于mapper级别的缓存
一级缓存默认开启 二级缓存默认关闭
当用户使用同一个sqlSession时查询到的数据可能是一级缓存的数据
不同的sqlSession使用同一个mapper时查询,查询到的数据可能是另一个sqlSession做相同操作留下的缓存
如果你配置了二级缓存,那么查询数据的顺序应该为:二级缓存→一级缓存→数据库
存放二级缓存数据的地方在Configration中
当一个sqlSession刷新或者关闭时,对应的缓存会被清空 使用select默认不会清空缓存 insert、update、delete默认会清空一级缓存
当一个用户通过sqlsession发送一条请求时,sqlsession会把sql语句交给executor,executor会先去本地缓存中查询是否有需要的数据,如果要是有会先从本地缓存中取出来,要是没有会跟数据库进行交互,
把查询出来的数据放到本地缓存,然后在返给用户
一级缓存的有效期
1当不是同一个sqlSession时 s1中的缓存 s2中不能用
2.当sqlSession调用.clearCache()方法的时候会自动清空缓存
3.当sqlSession对象关闭时
4. insert、update、delete默认会清空一级缓存
一级缓存实现的原理及性能分析
1.一级缓存通过简单的Map集合来实现,并没有对map集合的大小,容量进行限制
2.一级缓存是粗粒度缓存,没有办法去精确控制缓存中的数据是否存在过长,是否过期,以及更新缓存数据
3.多个sqlsession对象缓存中的数据无法共享
二级缓存 (一个xml文件对应一个二级缓存)
二级缓存需要手动配置
1.在总的配置文件中开启二级缓存
<setting name="cacheEnabled" value="true"/> |
2.在想要开启二级缓存的xml文件中加入 <cache></cache>标签
3.实体类实现serializable接口,进行序列化
执行顺序 二级缓存→一级缓存→数据库
eviction:缓存的回收策略
LRU - 最近最少使用,移除最长时间不被使用的对象
FIFO - 先进先出,按对象进入缓存的顺序来移除它们
SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK - 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象
默认的是LRU
flushInterval:缓存刷新间隔
缓存多长时间清空一次,默认不清空,设置一个毫秒值
readOnly:是否只读
true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
mybatis为了加快获取数据,直接就会将数据在缓存中的引用交给用户 。不安全,速度快
false:读写(默认):mybatis觉得获取的数据可能会被修改
mybatis会利用序列化&反序列化的技术克隆一份新的数据给你。安全,速度相对慢
size:缓存存放多少个元素
type:指定自定义缓存的全类名(实现Cache接口即可)
在新的sqlSession中对象,使用二级缓存需要先将前面的sqlSession对象关闭,数据才会进入二级缓存

一级缓存运行图

二级缓存运行原理图
