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

相关文章
|
8天前
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
3月前
|
SQL 缓存 Java
【面试官】Mybatis缓存有什么问题吗?
面试官:你说下对MyBatis的理解?面试官:那SqlSession知道吧?面试官:Mybatis的缓存有哪几种?面试官:那Mybatis缓存有什么问题吗?面试官:Mybatis分页插件是怎么
【面试官】Mybatis缓存有什么问题吗?
|
3月前
|
缓存 算法 Java
关于MyBatis的缓存详解
MyBatis 的缓存机制非常灵活,可以通过简单的配置来满足不同的性能需求。合理地使用缓存可以显著提高应用程序的性能,尤其是在处理大量数据库查询时。然而,开发者需要注意缓存的一致性和并发问题,特别是在使用可读写缓存时。
|
2月前
|
存储 缓存 大数据
Elasticsearch Filter 缓存加速检索的细节,你知道吗?
【8月更文挑战第23天】在大数据和全文检索领域,Elasticsearch(ES)凭借其高性能和可扩展性成为众多企业的首选。而在实际应用中,如何通过优化查询来提升检索效率,是每个开发者都需要关注的话题。其中,Filter 缓存作为一种有效的性能优化手段,在Elasticsearch中扮演着重要角色。本文将深入探讨Elasticsearch Filter 缓存的工作原理、优势及实现细节,为你在工作和学习中提供实用的技术干货。
36 0
|
2月前
|
存储 缓存 Java
|
2月前
|
存储 缓存 监控
Elasticsearch Filter 缓存加速检索的细节,你知道吗?
【8月更文挑战第15天】在大数据与搜索引擎的广阔天地里,Elasticsearch 凭借其强大的全文搜索能力和可扩展性,成为了众多企业和开发者的首选。而在Elasticsearch的性能优化中,Filter缓存(也称为Filter Cache,自Elasticsearch 7.x版本后更名为Query Cache的一部分)扮演着至关重要的角色。今天,我们就来深入探讨一下Elasticsearch Filter缓存如何加速检索过程,以及在日常工作学习中如何有效利用这一特性。
49 0
|
4月前
|
缓存 NoSQL Java
在 SSM 架构(Spring + SpringMVC + MyBatis)中,可以通过 Spring 的注解式缓存来实现 Redis 缓存功能
【6月更文挑战第18天】在SSM(Spring+SpringMVC+MyBatis)中集成Redis缓存,涉及以下步骤:添加Spring Boot的`spring-boot-starter-data-redis`依赖;配置Redis连接池(如JedisPoolConfig)和连接工厂;在Service层使用`@Cacheable`注解标记缓存方法,指定缓存名和键生成策略;最后,在主配置类启用缓存注解。通过这些步骤,可以利用Spring的注解实现Redis缓存。
69 2
|
4月前
|
SQL 缓存 Java
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
Java框架之MyBatis 07-动态SQL-缓存机制-逆向工程-分页插件
|
21天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
8天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用