MyBatis缓存-提高检索效率的利器--二级缓存

文章目录

  • 缓存-提高检索效率的利器
    • 缓存-官方文档
    • 二级缓存
      • 基本介绍
      • 二级缓存原理图
    • 二级缓存快速入门
      • 快速入门
      • 注意事项和使用陷阱
        • 理解二级缓存策略的参数
      • 四大策略
      • 如何禁用二级缓存
      • mybatis 刷新二级缓存的设置

缓存-提高检索效率的利器

缓存-官方文档

文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache

二级缓存

基本介绍

  1. 二级缓存和一级缓存都是为了提高检索效率的技术。
  2. 最大的区别就是作用域的范围不一样,一级缓存的作用域是sqlSession 会话级别,在一次会话有效,而二级缓存作用域是全局范围,针对不同的会话都有效。

二级缓存原理图

MyBatis缓存-提高检索效率的利器--二级缓存_第1张图片

二级缓存快速入门

快速入门

  1. mybatis-config.xml 配置中开启二级缓存

    <properties resource="jdbc.properties"/>

    
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        
        <setting name="cacheEnabled" value="true"/>
    settings>
  1. 使用二级缓存时entity 类实现序列化接口(serializable),因为二级缓存可能使用到序列化技术。不一定要实现,只是有的外部缓存需要。

MyBatis缓存-提高检索效率的利器--二级缓存_第2张图片

  1. 在对应的XxxMapper.xml 中设置二级缓存的策略

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    
    <mapper namespace="com.nlc.mapper.MonsterMapper">
    
        
        <cache eviction="FIFO" flushInterval="60000"  size="512" readOnly="true"/>
    
    mapper>
    
  2. 修改MonsterMapperTest.java , 完成测试

       //测试二级缓存的使用
        @Test
        public void level2CacheTest() {
    
            //查询id=3的monster
            Monster monster = monsterMapper.getMonsterById(3);
            System.out.println("monster=" + monster);
    
            //这里关闭sqlSession
            if (sqlSession != null) {
                sqlSession.close();
            }
    
            //重新获取sqlSession
            sqlSession = MyBatisUtils.getSqlSession();
            //重新获取了monsterMapper
            monsterMapper = sqlSession.getMapper(MonsterMapper.class);
            //再次查询id=3的monster
            System.out.println("--虽然前面关闭了sqlSession,因为配置二级缓存, " +
                    "当你再次查询相同的id时, 依然不会再发出sql, 而是从二级缓存获取数据----");
            Monster monster2 = monsterMapper.getMonsterById(3);
            System.out.println("monster2=" + monster2);
    
            Monster monster3 = monsterMapper.getMonsterById(3);
            System.out.println("monster3=" + monster3);
    
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    

注意事项和使用陷阱

理解二级缓存策略的参数

<cache eviction="FIFO" flushInterval="30000" size="360" readOnly="true"/>

上面的配置意思如下:
创建了FIFO 的策略,每隔30 秒刷新一次,最多存放360 个对象而且返回的对象被认为是只读的。
eviction:缓存的回收策略
flushInterval:时间间隔,单位是毫秒,
size:引用数目,内存大就多配置点,要记住你缓存的对象数目和你运行环境的可用内存
资源数目。默认值是1024
readOnly:true,只读

四大策略

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

如何禁用二级缓存

一、修改resources\mybatis-config.xml

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    
    <setting name="cacheEnabled" value="false"/>
settings>

​ 二、修改mapper\MonsterMapper.xml,取消缓存


​ 三、或者更加细粒度的, 在配置方法上指定useCache=“false”
MyBatis缓存-提高检索效率的利器--二级缓存_第3张图片

设置useCache=false 可以禁用当前select 语句的二级缓存,即每次查询都会发出sql 去查询,默认情况是true,即该sql 使用二级缓存。
注意:一般我们不需要去修改,使用默认的即可。

mybatis 刷新二级缓存的设置

可以在实现方法上配置刷新缓存:flushCache=“true”

<update id="updateMonster" parameterType="Monster" flushCache="true">
UPDATE mybatis_monster SET NAME=#{name},age=#{age} WHERE id=#{id}
update>

insert、update、delete 操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
默认为true,默认情况下为true 即刷新缓存,一般不用修改。

你可能感兴趣的:(MyBatis,mybatis,缓存,java)