一、系统缓存(一级缓存和二级缓存)
MyBatis对缓存提供支持,默认情况下只开启一级缓存。
一级缓存:
在参数和SQL完全一样的情况下,我们使用同一个 SqlSession对象调用同一个 Mapper的方法,往往只执行一次SQL,因为使用 SqlSession第一次查询后, MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没超时的情况下 SqlSession 都只会取出当前缓存的数据,而不会次发送SQL到数据库。
不同的SqlSession对象是相互隔离的。
二级缓存:
二级缓存在SqlSessionFactory层面上提供给各个SqlSession对象共享。
1、二级缓存的开启需要配置 :只需在xml文件中配置:
2、MyBatis需要返回的POJO必须是可序列化的 实现Serializable接口
满足上面的1、2后,即可使用二级缓存,即:
● 映射语句文件中的所有 select语句将会被缓存
● 映射语句文件中的所有 insert、 update和 delete语句会刷新缓存。
● 缓存会使用默认的 Least Recently Used(LRU,最近最少使用的)算法来收回
● 根据时间表,比如 No Flush Interval,(CFI,没有刷新间隔),缓存不会以任何时间顺序来刷新。
● 缓存会存储列表集合或对象(无论查询法返回什么)的1024个引用。
● 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,不干扰其他调用者或线程所做的潜在修改。
关于二级缓存配置的一些属性:
<cache eviction="LRU" flushInterval="100000" sizes="1024" readOnly="true"/>
● eviction:代表的是缓存回收策略,目前 My Batis提供以下策略。
1)LRU,最近最少使用的,移除最长时间不用的对象。
2)FIFO,先进先出,按对象进入缓存的顺序来移除它们。
3)SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象。
4)WEAK,弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU,移除最长时间不用的对象。
● flushInterval:刷新间隔时间,单位为毫秒,这里配置是100秒刷新,如果你不配
置它,那么当SOL被执行的时候才会去刷新缓存
● size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。这里配置的是1024个对象。
● readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有办法修改缓存,它的默认值为 false,允许我们修改。
自定义缓存
1、配置自定义缓存
<cache type = “com.learn.MyCache”/>
MyCache是自定义的缓存类,该类需要实现mybatis提供的接口:org.apache.ibatis.cache.Cache
2、自定义缓存参数
<cache type=“MyCache”>
<property name = “host” value=“localhost”/>
</cache>
也可在缓存类MyCache类中增加setHost方法
3、配置SQL层面上的缓存规则
useCache:是否使用缓存
flushCache:插入后是否需要刷新缓存
<select ... flushCache = “false” useCache = “true”/>
<insert ... flushCache = “true”/>
<update ... flushCache = “true”/>
<delete ... flushCache = “true”/>