mybatis-plus二级缓存
mybatis-plus二级缓存
在mybatis-plus 中 一级缓存、二级缓存都是默认开启了的。
1、一级缓存
一级缓存又被称为 SqlSession 级别的缓存。
SqlSession是什么?SqlSession 是SqlSessionFactory会话工厂创建出来的一个会话的对象,这个SqlSession对象用于执行具体的SQL语句并返回给用户请求的结果。
SqlSession级别的缓存是什么意思?SqlSession级别的缓存表示的就是每当执行一条SQL语句后,默认就会把该SQL语句缓存起来,也被称为会话缓存
1 |
|
测试后发现执行了三次查询,并没有使用到一级缓存,看了日志后发现是在service执行完成后就会立即关闭sqlsession。
于是我在service 方法中重复调用mapper 方法。如下
1 | Node node = nodeMapper.selectById(id); |
发现依然执行了多次查询,想了下可能时因为没有开启事务的原因,于是去开启了事务。然后OK
2、二级缓存
二级缓存是namespace级别的,mybatis默认不开启的,但是mybatis-plus 默认是开启的。
注意:注解和xml两种方式不可以配合使用,必须全用注解或全用xml
2.1、xml方式的缓存配置
在mapper.xml中加入如下代码
1 | <!-- 开启User支持二级缓存 --> |
然后使用即可,如果想要某查询不适用缓存可加上查询xml中加上 useCache=”false”
2.2、注解方式的缓存配置(mybatis-plus可使用)
在mapper上加上注解,@CacheNamespace(eviction = FifoCache.class,flushInterval = 60000)
这时候在xml里面的查询是不会使用缓存的,须要使用 @Select注解 , mybatis-plus默认的查询方法亦可以使用缓存了。
2.3、缓存相关的属性
flushInterval (刷新间隔)可以被设置为任意的正整数,而且它代表一个合理的毫秒形式的时间段。默认情况是不设置,即没有刷新间隔,缓存仅仅调用语句时刷新。
size(引用数目)可被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
eviction(收回策略)缓存的回收策略,默认是 LRU
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。