背景
在日常的开发过程中,总会检查到以前的接口性能是特别的不好,但是有历史原因又不敢去动里面的逻辑,但是当我们使用的mybatis的时候,并且发现这个接口比较频繁的查询某一个数据的时候,并且这个数据对于用户来说可以存在一定的延迟,那么mybatis的二级缓存就派上用场了,接下来看下我们怎么来开启mybatis的二级缓存的吧
一、基于Spring+Mybatis
- mybaits的二级缓存是mapper范围级别,要在具体的mapper.xml中开启二级缓存。在核心配置文件 中加入:
1. <setting name="cacheEnabled"value="true"/>
<!-- 全局配置参数,需要时再设置 -->
<settings>
<!-- 开启二级缓存 默认值为true -->
<setting name="cacheEnabled" value="true"/>
</settings>
- mpper.xml中开启二缓存,mapper.xml下的sql执行完成会存储到它的缓存区域(HashMap)。
1. <mapper namespace="cn.hpu.mybatis.mapper.UserMapper">
<!-- 开启本mapper namespace下的二级缓存 -->
<cache></cache>
- 对应的pojo实现序列化(implements Serializable)
注意:开启缓存的弊端是数据没有实时性,当数据库中的数据一旦修改,查询的数据还是缓存中的数据没有实时性,对于某些需要实时性显示数据的接口我们可以设置useCache="false",设置该属性后,该接口每次查询出来都是去执行sql查询出实时性数据。
相关配置说明:
①.设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。
<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
总结:针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存。
②.清空缓存
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">
总结:一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。
注意:
(1)当为select语句时:
flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
useCache默认为true,表示会将本条语句的结果进行二级缓存。
(2)当为insert、update、delete语句时:
flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。
useCache属性在该情况下没有。
当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的,所以,如果有必要,那么就需要人工修改配置
二、Springboot+Mybatis
1、mapper注解配置
以下注解针对的是整个mapper中的sql生效
@CacheNamespace
flushInterval:缓存刷新间隔,缓存多长时间清空一次,默认不清空,设置一个毫秒值
因为上面的注解是针对整个mapper生效,那么如果mapper里面的那个sql不需要支持二级缓存的话就在方法上增加下面的注解
@Options(useCache = false)
2、对象需要实现序列化
对应的pojo实现序列化(implements Serializable)
三、验证
请自行验证