Mybatis 二级缓存(全局缓存)

文章目录

二级缓存(全局缓存)基于namespace级别的缓存,一个namespace对应一个二级缓存。

工作机制

  1. 一个会话,查询一条数据,这个数据就会被放在当前会话一级缓存中;
  2. 如果会话关闭,一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容;
  3. 不同的namespace查出的数据会放在自己对应的缓存中(map);

使用

开启全局二级缓存配置:(只对二级缓存有效)

<setting name="cacheEnabled" value="true"/>

一级缓存在sql标签设置useCache,如果关闭了一级缓存,肯定二级缓存也就无法使用

mapper中配置使用二级缓存

<!-- 
  eviction:缓存的回收策略
   LRU      - 最近最少使用的:移除最长时间不被使用的对象
   FIFO - 先进先出:按对象进入缓存的顺序来移除它们
   SOFT - 软引用:移除基于垃圾回收器状态和软引用规则的对象
   WEAK - 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则 对象
   默认是LRU
  flushInterval:缓存刷选间隔
   缓存多长时间清空一次,默认不清空,设置一个毫秒值
  readOnly:是否只读,默认false
   true:只读:所有从缓存中获取数据的操作都是只读操作,不会修改数据
     mybatis为了加快速度,直接就会将数据缓存中的引用交给用户,不安全,速度快
   false:非只读:mybatis觉得获取的数据可能会被修改
     mybatis会利用反序列化的技术克隆一份新的数据给你,安全,速度慢
  size:缓存存放多少元素:
  type:指定自定义缓存的全类名
  -->
<cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024" >
</cache>

POJO需要实现序列号,继承Serializable接口。

工作顺序

查出的数据都会默认放在一级缓存中,只有当SqlSession会话关闭以后,一级缓存中的数据才会转移到二级缓存中。

原文链接:,转发请注明来源!

发表评论