mybatis-plus二级缓存

在mybatis-plus 中 一级缓存、二级缓存都是默认开启了的。

1、一级缓存

一级缓存又被称为 SqlSession 级别的缓存。

SqlSession是什么?SqlSession 是SqlSessionFactory会话工厂创建出来的一个会话的对象,这个SqlSession对象用于执行具体的SQL语句并返回给用户请求的结果。

SqlSession级别的缓存是什么意思?SqlSession级别的缓存表示的就是每当执行一条SQL语句后,默认就会把该SQL语句缓存起来,也被称为会话缓存

1
2
3
4
5
6
@Test
public void run(){
Node node = nodeService.findById("17121e5a7333");
Node node1 = nodeService.findById("17121e5a7333");
Node node2 = nodeService.findById("17121e5a7333");
}

测试后发现执行了三次查询,并没有使用到一级缓存,看了日志后发现是在service执行完成后就会立即关闭sqlsession。

于是我在service 方法中重复调用mapper 方法。如下

1
2
Node node = nodeMapper.selectById(id);
Node node1 = nodeMapper.selectById(id);

发现依然执行了多次查询,想了下可能时因为没有开启事务的原因,于是去开启了事务。然后OK

2、二级缓存

二级缓存是namespace级别的,mybatis默认不开启的,但是mybatis-plus 默认是开启的。

注意:注解和xml两种方式不可以配合使用,必须全用注解或全用xml

2.1、xml方式的缓存配置

在mapper.xml中加入如下代码

1
2
<!-- 开启User支持二级缓存 -->
<cache/>

然后使用即可,如果想要某查询不适用缓存可加上查询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

  1.  LRU – 最近最少使用的:移除最长时间不被使用的对象。
    
  2.  FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
    
  3.  SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
    
  4.  WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。