目录
缓存:暂时的存储一些数据,加快系统的查询速度等等
Mybatis缓存机制:Map ->可以保存查询出的一些数据。
一级缓存:线程级别的缓存,本地缓存,sqlSession级别的缓存
二级缓存:全局范围的缓存;除过当前前程,当前sqlSession能用外,其他也可以使用。nameSpace级别的缓存
1、一级缓存
sqlSession级别的缓存,默认存在的
1)只要之前查询过的数据,mybatis就会保存在一个缓存中(map);下次获取直接从缓存中拿。
2)一级缓存失效的几种情况
- 不同的sqlSession使用不同的以及缓存,只有在当前的同一个sqlSession期间查询到的数据会保存到这个sqlSession的缓存中,下一次使用这个sqlSession查询就会从缓存中拿。
- 一级缓存中没有缓存过这个数据。同一个方法,不同参数,可能因为之前没查过,所以还会发新的sql。
- 只要在同一个sqlSession期间,执行任何一个增删改操作,都会把一级缓存清空(不管是否和缓存的数据有关)
- 调用当前sqlSession的clearCache方法,手动清除了缓存。
- 每次查询,先看一级缓存中有没有,如果没有就重新发送sql查询。
- 每一个sqlSession拥有自己的一级缓存
(3)一级缓存不能被关闭,但可以使用clearCache方法清空本地本地缓存,或者使用配置来改变缓存的作用域
2、二级缓存
二级缓存:(second level cache)全局作用域缓存
- 二级缓存默认不开启,需要手动配置
- Mybatis提供了二级缓存的接口以及实现,缓存实现要求POJO实现Serializable接口
- 二级缓存在sqlSession关闭或者提交后才会生效
(1)使用步骤:
- 全局配置文件中开启二级缓存
<settings> <!--开启二级缓存--> <setting name="cacheEnabled" value="true"/> </settings>
- 配置要使用二级缓存的Mapper.xml文件中,开启二级缓存
- POJO实现Serializable序列化接口
(2)缓存相关属性
eviction:缓存的回收策略
LRU:最近最少使用的,移除最长时间不被使用的对象
FIFO:先进先出,按对象进入缓存的顺利来移除他们
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK:弱引用,更积极的移除基于垃圾回收器状态和弱引用规则的对象
默认的是LRU。
flushInterval:刷新间隔,单位毫秒
默认不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
size:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易造成内存溢出。
默认值是 1024。
readOnly:只读,true/false
true:只读缓存。给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势,但是会有一些安全问题。
false:读写缓存。会返回缓存对象的拷贝,(通过序列化)。会慢一点,但比较安全。
因此默认是false
3、缓存的查询顺序
现象一:一级缓存和二级缓存中不会有同一个数据
当一级缓存关闭了二级缓存就有数据了。
当二级缓存中没有此数据,就会看一级缓存,一级缓存也没有,就回去查数据库,查询后的结果放在一级缓存中。
任何时候都是先看二级缓存,再看一级缓存!如果大家都没有,再去查询数据库。查询完,将返回的数据添加到一级缓存中,一级缓存关闭或者sqlSession提交后,将数据放入二级缓存。
4、缓存有关的设置
(1)全局setting的cacheEnable:
配置二级缓存的开关。一级缓存一直是开着的。
(2)select标签的useCache:
配置这个select是否使用二级缓存,一级缓存一直是使用的。
(3)sql标签的flushCache属性:
增删改默认flushCache=true,sql执行后会同时清除一级缓存和二级缓存。
查询默认flushCache=false
(4)sqlSession的clearCache()方法
只是用来清除一级缓存的
5、整合第三方缓存
实现Cache接口即可
mapper.xml中设置<cache type="外部缓存的实现cache的类"
还可以使用<cache-ref namespeace="">指定当前Mapper和其他的Mapper共用一个缓存