美文网首页
[java]38、MyBatis缓存

[java]38、MyBatis缓存

作者: 史记_d5da | 来源:发表于2022-05-04 18:50 被阅读0次

1、缓存

MyBatis的缓存分为一级缓存、二级缓存,用于缓存select的结果

1.1、一级缓存

一级缓存是存放到了SqlSession对象中
同一个SqlSessionselect共享缓存
所以关闭SqlSession时,缓存也就失效
执行insertupdatedeletecommit等方法时,会自动清理一级缓存
在大多数情况下,每次查询都是不同的SqlSession,所以一级缓存命中率并不高

public void firstLevel() {
    try (SqlSession session = MyBatises.openSession()) {
        Job job1 = session.selectOne("job.get", 1);
        Job job2 = session.selectOne("job.get", 1);
        System.out.println(job1 ==  job2);
    }
}

上面的执行结果为true,此时的session对象没有被销毁,为同一个对象

1.2、二级缓存

1、为了提高缓存命中率,可以开启MyBatis的二级缓存,namespacemapper)级别的缓存
同一个namespace下的select共享缓存
默认情况,namespaceinsertupdatedelete执行成功时,会自动清理二级缓存。
当调用SqlSessionclose方法时,会将查询结果放到二级缓存
2、开启二级缓存
mybatis-config.xml中配置

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

在映射文件的mapperjob.xml)中添加cache标签,默认会缓存映射文件中的所有select的结果

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

size:缓存有多少个存储结果(单个对象或一个列表)的引用,默认1024
eviction:当缓存数量超过size的清除策略。可选值有

  • LRU:最近最少使用:移除最长时间不被使用的对象。
  • FIFO:先进先出:基于垃圾回收器状态和软引用规则移除对象。
  • SOFT:软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK:弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

flushInterval:每个多少毫秒清除一次缓存,默认不会定时清除缓存
readOnlytrue代表缓存的是对原对象的引用,false:代表缓存的是原对象序列化后的拷贝对象,所以false时要实现Serializable接口。默认是false
以下是 readOnly=false的情况:

public void secondLevel2() {
    SqlSession session1 = MyBatises.openSession();
    Job job1 = session1.selectOne("job.get", 1);
    job1.setName("aaaaaaaaa");
    System.out.println(job1);
    session1.close(); // 会被加入到二级缓存
    job1.setName("bbbbbb"); // 不会被加入到缓存,因为没有调用close
        
    SqlSession session2 = MyBatises.openSession();
    Job job2 = session2.selectOne("job.get", 1);
    System.out.println(job2);
}

3、延迟加载的全局开关
mybatis-config.xml中配置

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

true:所有这只了select属性的关联对象默认懒加载,可以通过fetchType覆盖这个全局设置。
false:所有设置了select属性的关联对象默认立即加载,可以通过fetchType覆盖这个全局设置
4、激进的延迟加载开关
mybatis-config.xml中配置

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

true:当调用主对象的任意方法,都会触发立即加载关联对象
false:只有当真正用到关联对象时,才会去加载关联对象

1.3、useCache、flushCache

可以通过设置useCache属性来决定某个select是否需要开启二级缓存

<select id="list" resultType="com.sj.bean.Job" useCache="false">
    <include refid="sqlListAll"></include>
</select>

可以通过设置flushCache属性来决定某个操作之后是否需要清除缓存

<select id="get" parameterType="int" resultType="com.sj.bean.Job" flushCache="false">
    <include refid="sqlListAll" /> WHERE id = #{id}
</select>

相关文章

网友评论

      本文标题:[java]38、MyBatis缓存

      本文链接:https://www.haomeiwen.com/subject/swxgyrtx.html