缓存作用:
- 减少IO,提高系统性能。
- mybatis提供了一级缓存和二级缓存
一级缓存:
- 一级缓存是sqlsession级别的缓存,同一个sqlsession中的缓存共享,不同sqlsession互不影响。
- sqlsession对象通过使用HashMap来缓存数据。
工作原理:
- 用户发起sql查询时,如果缓存中没有就从数据库查找,并将查询结果存储到一级缓存中。
- 在同一个sqlsession中,再次发起sql查询时,如果缓存中存在,就直接从缓存中获取信息,不去数据库查找(这样就减少磁盘IO了)
- 如果中途其他sqlsession执行了commit操作(插入,更新,删除),就会清空sqlsession中的一级缓存,避免脏读。
示例:
1、一级缓存是mybatis默认缓存(无须设置)
2、配置日志(为了看到sql查询语句)
3、对同一个员工在一个sqlsession中进行三次查询
4、可以看到,sql语句只执行了一次,第二次第三次查询时,在一级缓存中查找到了,就不去数据库查了。
一级缓存失效:
- sqlsession对象不同
- 查询条件不同,即缓存中找不到
- 两次查询之间进行插入删除更新等操作
- 手动清除了一级缓存
二级缓存:
- 二级缓存是namespace级别的缓存,多个sqlsession共享二级缓存。
工作原理:
示例:
1、在config.xml中开启二级缓存
<settings>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
在具体的mapper.xml中开启二级缓存
<!--开启本Mapper的namespace下的二级缓存-->
<cache eviction="LRU" flushInterval="10000"/>
cache 属性的简介:eviction 回收策略(缓存满了的淘汰机制),目前 MyBatis 提供以下策略。
- LRU(Least Recently Used),最近最少使用的,最长时间不用的对象
- FIFO(First In First Out),先进先出,按对象进入缓存的顺序来移除他们
- SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象
- WEAK,弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU, 移除最长时间不用的对象。
flflushInterval: 刷新间隔时间,单位为毫秒。
- 这里配置的是100秒刷新,如果你不配置它,那么当SQL被执行的时候才会去刷新缓存。
size: 引用数目。
- 一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。(这里配置的是1024个对象)
readOnly: 只读。
- 意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有办法修改缓存,他的默认值是false,不允许我们修改
2、使用不同的sqlsession进行两次查询(注意:第一次的查询要commit之后,二级缓存中才存在部门信息,否则部门信息只存在session1的一级缓存中)
3、可以看到session1查询时执行了一次sql,session2查询的时候直接从二级缓存中取数据