Mybatis 对缓存提供支持,一级缓存是默认使用的,二级缓存需要手动开启。
区别
一级缓存的作用域是一个 sqlsession 内;
二级缓存作用域是针对 mapper 进行缓存;
一级缓存
在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用一个 Mapper 方法,往往只执行一次 SQL,因为使用 SelSession 第一次查询后,MyBatis 会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession 都会取出当前缓存的数据,而不会再次发送 SQL 到数据库。
一级缓存时执行 commit,close,增删改等操作,就会清空当前的一级缓存;当对 SqlSession 执行更新操作(update、delete、insert)后并执行 commit 时,不仅清空其自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行 commit()的效果)。
二级缓存
二级缓存指的就是同一个 namespace 下的 mapper,二级缓存中,也有一个 map 结构,这个区域就是一级缓存区域。一级缓存中的 key 是由 sql 语句、条件、statement 等信息组成一个唯一值。一级缓存中的 value,就是查询出的结果对象。
1、在配置文件中 开启二级缓存的总开关
1 | <setting name="cacheEnabled" value="true" /> |
2、 在 mapper 映射文件中开启二级缓存
1 | <cache eviction="FIFO" flushInterval="60000" size="512" |
参数名属性 eviction 收回策略 flushInterval 刷新间隔 size 引用数目 readOnly 只读
关于 eviction 的各个参数属性:
参数名属性 eviction=”LRU”最近最少使用的:移除最长时间不被使用的对象。
(默认)eviction=”FIFO”先进先出:按对象进入缓存的顺序来移除它们。
eviction=”SOFT”软引用:移除基于垃圾回收器状态和软引用规则的对象。
eviction=”WEAK”弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
3、实体类实现 Serializable
禁用缓存
如测试 sql 语句性能时缓存会影响测试准确性 需要禁用在映射文件中:默认值是 true useCache=”false”
1 | <select id="findAllPets" resultMap="petsMap" useCache="false"> |
刷新缓存
在映射文件中:属性:flushCache=”true”刷新缓存,在查询语句中,默认值是 false,在新增删除修改语句中,默认值是 true(清空缓存)