美文网首页
[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