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

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

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


缓存-官方文档


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


二级缓存


基本介绍


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


二级缓存原理图

77fe2ab89b98483cae95684c26231d44.png


二级缓存快速入门


快速入门


  1. mybatis-config.xml 配置中开启二级缓存
<!--引入外部的jdbc.properties-->
    <properties resource="jdbc.properties"/>
    <!--配置MyBatis自带的日志输出-查看原生的sql-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--
        1、全局性地开启或关闭所有映射器配置文件中已配置的任何缓存, 可以理解这是一个总开关
        2、默认就是: true
        -->
        <setting name="cacheEnabled" value="true"/>
    </settings>


  1. 使用二级缓存时entity 类实现序列化接口(serializable),因为二级缓存可能使用到序列化技术。不一定要实现,只是有的外部缓存需要。

db94a191c29a44d3888747f35ecc5e17.png


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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--解读
1. 这是一个mapper xml 文件
2. 该文件可以去实现对应的接口的方法
3. namespace 指定该xml文件和哪个接口对应!!!
-->
<mapper namespace="com.nlc.mapper.MonsterMapper">
    <!--
        1、配置二级缓存: 是mybatis自带
        2、FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
        3. flushInterval 刷新间隔 是毫秒单位 60000 表示 60s
        4. size="512": 引用数目, 属性可以被设置为任意正整数, 默认1024
        5. readOnly="true": (只读)属性可以被设置为 true 或 false: 如果我们只是用于读操作,
        建议设置成 true, 这样可以提示效率, 如果有修改操作,设置成 false, 默认就是false
    -->
    <cache eviction="FIFO" flushInterval="60000"  size="512" readOnly="true"/>
</mapper>


修改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"/>
    <!--全局性地开启或关闭所有映射器配置文件中已配置的任何缓存, 默认就是true-->
    <setting name="cacheEnabled" value="false"/>
</settings>


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

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


三、或者更加细粒度的, 在配置方法上指定useCache=“false”

814be1db32d54ce28ade059b7aa0cac8.png

设置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 即刷新缓存,一般不用修改。

相关文章
|
15天前
|
XML 缓存 Java
MyBatis二级缓存解密:深入探究缓存机制与应用场景
MyBatis二级缓存解密:深入探究缓存机制与应用场景
49 2
MyBatis二级缓存解密:深入探究缓存机制与应用场景
|
1月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
|
1月前
|
缓存 Java 数据库连接
mybatis 数据库缓存的原理
MyBatis 是一个流行的 Java 持久层框架,它封装了 JDBC,使数据库交互变得更简单、直观。MyBatis 支持两级缓存:一级缓存(Local Cache)和二级缓存(Global Cache),通过这两级缓存可以有效地减少数据库的访问次数,提高应用性能。
282 1
|
1月前
|
存储 缓存 Java
【MyBaits】4、延迟加载、MyBatis 的缓存
【MyBaits】4、延迟加载、MyBatis 的缓存
22 0
|
2月前
|
SQL 缓存 Java
mybatis缓存详解
mybatis缓存详解
23 0
|
3月前
|
缓存 Java 数据库连接
mybatis的缓存内容(下)
mybatis的缓存内容
30 0
|
1月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
42 1
|
1月前
|
druid Java 数据库连接
Spring Boot3整合MyBatis Plus
Spring Boot3整合MyBatis Plus
45 1
|
3月前
|
Java 数据库连接 Maven
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
|
30天前
|
敏捷开发 监控 前端开发
Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构
Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构
72 0