Springboot集成Mybatis之二级缓存
Mybatis的缓存
Mybatis的缓存分为一级缓存和二级缓存。一级缓存是默认开启的,二级缓存需要手动开启。
一级缓存是SqlSession级别的缓存,作用域是一个SqlSession。在同一个SqlSession中,执行相同的查询sql,第一次会先去查询数据库,并写入缓存。第二次再执行时,则直接从缓存中取数据。如果两次执行查询sql的中间执行了增删改操作,则会清空该SqlSession的缓存。
二级缓存是mapper级别的缓存。作用域是是mapper的同一个namespace下的sql语句。第一次执行查询SQL时,会将查询结果存到二级缓存区域内。第二次执行相同的查询SQL,则直接从缓存中取出数据。如果两次执行查询sql的中间执行了增删改操作,则会清空该namespace下的二级缓存。
1、开启二级缓存
1)修改resources目录下的application.properties配置文件,加入开启mybatis二级缓存的配置和打印执行sql的配置
# 开启mybatis的二级缓存 mybatis.configuration.cache-enabled=true # 开启sql打印 logging.level.com.batis.mapper=debug
2)修改resources目录下mapping目录对应的Mapper文件
<!-- 开启二级缓存 --> <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"></cache>
说明:
eviction: 回收策略
- LRU 最近最少使用的,移除最长时间不被使用的对象,这是默认值
- FIFO 先进先出,按对象进入缓存的顺序来移除它们
- SOFT 软引用,移除基于垃圾回收器状态和软引用规则的对象
- WEAK 弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象
flushInterval: 刷新间隔,以毫秒为单位,100000表示每100秒刷新一次缓存。不设置的话,则每次调用语句时刷新。
readOnly: 只读
属性可以被设置为true后者false。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,这提供了很重要的性能优势。可读写的缓存会通过序列化返回缓存对象的拷贝,这种方式会慢一些,但很安全,因此默认为false。
size: 可以被设置为任意的正整数,要记住缓存的对象数目和运行环境的可用内存资源数目,默认1024。
3)可以在Mapper的具体方法下设置对二级缓存的访问意愿:
<select id="save" parameterType="XX" flushCache="true" useCache="false"> </select>
如果没有去配置flushCache、useCache,那么默认是启用缓存的
- flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
- useCache默认为true,表示会将本条语句的结果进行二级缓存。
- 在insert、update、delete语句时: flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。 useCache属性在该情况下没有。update 的时候如果 flushCache="false",则当你更新后,查询的数据数据还是老的数据。
启用测试