概述
缓存可以极大的提升查询效率
缓存:暂时的存储一些数据;加快系统的查询速度
MyBatis系统中默认定义了两级缓存。
MyBatis缓存机制:Map;能保存查询出的一些数据;
一级缓存:线程级别的缓存;本地缓存;SqlSession级别的缓存;
二级缓存:全局范围的缓存;除过当前线程;SqlSession能用外其他也可以使用;
一级缓存
MyBatis:SqlSesion级别的缓存;默认存在;一次数据库会话。
机制:只要之前查询过的数据,mybatis就会保存在一个缓存中(Map);下次获取直接从缓存中拿;
一级缓存失效的几种情况:
- 1、不同的SqlSession对应不同的一级缓存
- 2、同一个SqlSession但是查询条件不同
- 3、同一个SqlSession两次查询期间执行了任何一次增删改操作
- 4、同一个SqlSession两次查询期间手动清空了缓存
当 Session flush 或 close 后, 该 Session 中的所有 Cache 将被清空。
本地缓存不能被关闭, 但可以调用 clearCache() 来清空本地缓存, 或者改变缓存的作用域.
二级缓存
二级缓存:namespace级别的缓存;MyBatis提供二级缓存的接口以及实现,缓存实现要求POJO实现Serializable接口
一级缓存;SqlSession关闭或者提交以后,一级缓存的数据会放在二级缓存中;
mybatis默认没有使用的;配置;
<settings>
<!--开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
mapper下还要添加标签
<!--使用二级缓存-->
<cache></cache>
二级缓存的相关配置
在mapper配置文件中添加的cache标签可以设置一些属性:
eviction属性:缓存回收策略
LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。
FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是 LRU。
flushInterval属性:刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
size属性:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
readOnly属性:只读,true/false
true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了
很重要的性能优势。
false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是
false。
缓存的查询顺序
1、一级缓存和二级缓存不会有同一个数据
①二级缓存中的数据:一级缓存关闭了就将数据放入二级缓存
②一级缓存中的数据:二级缓存中没有的数据,就会放在一级缓存,一级缓存也没有就去查数据库;
查完放一级缓存中
2、任何时候都是先看二级缓存,再看一级缓存;如果大家都没有,就去查询数据库
缓存的原理
- 1、全局setting的cacheEnable:
- 配置二级缓存的开关。一级缓存一直是打开的。
- 2、select标签的useCache属性:
- 配置这个select是否使用二级缓存。一级缓存一直是使用的
- 3、sql标签的flushCache属性:
- 增删改默认flushCache=true。sql执行以后,会同时清空一级和二级缓存。查询默认flushCache=false。
- 4、sqlSession.clearCache():
- 只是用来清除一级缓存。
- 5、当在某一个作用域 (一级缓存Session/二级缓存Namespaces) 进行了 C/U/D 操作后,
默认该作用域下所有 select 中的缓存将被clear。