提高检索效率的利器--Mybatis 的一级缓存和二级缓存执行顺序

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 提高检索效率的利器--Mybatis 的一级缓存和二级缓存执行顺序

Mybatis 的一级缓存和二级缓存执行顺序


缓存-官方文档


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


Mybatis 的一级缓存和二级缓存执行顺序


缓存执行顺序是:二级缓存–>一级缓存–>数据库

说的再多不如眼见为实,让我们用代码来证明吧


测试


代码实现


  1. 修改com\nlc\mapper\MonsterMapperTest.java
    演示二级缓存->一级缓存->DB执行的顺序
    @Test
    public void cacheSeqTest() {
        System.out.println("查询第1次");
        //DB, 会发出SQL, 分析cache hit ratio 0.0
        Monster monster1 = monsterMapper.getMonsterById(3);
        System.out.println(monster1);
        //这里关闭sqlSession, 一级缓存数据没有
        //当我们关闭一级缓存的时候,如果你配置二级缓存,那么一级缓存的数据,会放入到二级缓存
        sqlSession.close();
        sqlSession = MyBatisUtils.getSqlSession();
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        System.out.println("查询第2次");
        //从二级缓存获取id=3 monster , 就不会发出SQL, 分析cache hit ratio 0.5
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println(monster2);
        System.out.println("查询第3次");
        //从二级缓存获取id=3 monster, 不会发出SQL, 分析cache hit ratio 0.6666
        Monster monster3 = monsterMapper.getMonsterById(3);
        System.out.println(monster3);
        if (sqlSession != null) {
            sqlSession.close();
        }
        System.out.println("操作成功");
    }


运行结果

查询第1次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.0
Opening JDBC Connection
Created connection 527829831.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1f760b47]
==>  Preparing: SELECT * FROM `monster` WHERE id = ?
==> Parameters: 3(Integer)
<==    Columns: id, age, birthday, email, gender, name, salary
<==        Row: 3, 51, 4015-09-12, qwrw@df.com, 1, 风衣精, 1965
<==      Total: 1
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1f760b47]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1f760b47]
Returned connection 527829831 to pool.
查询第2次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.5
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
查询第3次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.6666666666666666
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
操作成功


细节说明


  1. 不会出现一级缓存和二级缓存中有同一个数据。因为二级缓存(数据)是在一级缓存关闭之后才有的。
  2. 看这段代码, 修改com\nlc\mapper\MonsterMapperTest.java , 不关闭一级缓存, 看看运行效果
 //分析缓存执行顺序
    //二级缓存->一级缓存->DB
    //因为二级缓存(数据)是在一级缓存关闭之后才有的
    @Test
    public void cacheSeqTest2() {
        System.out.println("查询第1次");
        //DB , 会发出 SQL, cache hit ratio 0.0
        Monster monster1 = monsterMapper.getMonsterById(3);
        System.out.println(monster1);
        //这里我们没有关闭sqlSession
        System.out.println("查询第2次");
        //从一级缓存获取id=3 , cache hit ratio 0.0, 不会发出SQL
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println(monster2);
        System.out.println("查询第3次");
        //还是从一级缓存获取id=3, cache hit ratio 0.0, 不会发出SQL
        Monster monster3 = monsterMapper.getMonsterById(3);
        System.out.println(monster3);
        if (sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }
        System.out.println("操作成功");
    }



  1. 运行效果, 可以看到,在一级缓存存在的情况下,依然是先查询二级缓存,但是因为二级缓存,没有数据, 所以命中率都是0.0 , 可以debug 下。
查询第1次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.0
Opening JDBC Connection
Created connection 485845532.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1cf56a1c]
==>  Preparing: SELECT * FROM `monster` WHERE id = ?
==> Parameters: 3(Integer)
<==    Columns: id, age, birthday, email, gender, name, salary
<==        Row: 3, 51, 4015-09-12, qwrw@df.com, 1, 风衣精, 1965
<==      Total: 1
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
查询第2次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.0
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
查询第3次
Cache Hit Ratio [com.nlc.mapper.MonsterMapper]: 0.0
Monster{id=3, age=51, name='风衣精', email='qwrw@df.com', birthday=Sat Sep 12 00:00:00 CST 4015, salary=1965.0, gender=1}
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1cf56a1c]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@1cf56a1c]
Returned connection 485845532 to pool.
操作成功


😄总结


  1. 缓存执行顺序是:二级缓存–>一级缓存–>数据库
  2. 二级缓存(数据)是在一级缓存关闭之后才有的。
  3. 二级缓存和一级缓存都是为了提高检索效率的技术,最大的区别就是作用域的范围不一样。
  4. 一级缓存的作用域是sqlSession 会话级别,在一次会话有效,而二级缓存作用域是全局范围,针对不同的会话都有效。


文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁

希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
缓存 Java 数据库连接
MyBatis三级缓存实战:高级缓存策略的实现与应用
MyBatis三级缓存实战:高级缓存策略的实现与应用
35 0
MyBatis三级缓存实战:高级缓存策略的实现与应用
|
18天前
|
XML 缓存 Java
MyBatis二级缓存解密:深入探究缓存机制与应用场景
MyBatis二级缓存解密:深入探究缓存机制与应用场景
55 2
MyBatis二级缓存解密:深入探究缓存机制与应用场景
|
18天前
|
存储 缓存 Java
探秘MyBatis缓存原理:Cache接口与实现类源码分析
探秘MyBatis缓存原理:Cache接口与实现类源码分析
34 2
探秘MyBatis缓存原理:Cache接口与实现类源码分析
|
2月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
|
2月前
|
缓存 Java 数据库连接
mybatis 数据库缓存的原理
MyBatis 是一个流行的 Java 持久层框架,它封装了 JDBC,使数据库交互变得更简单、直观。MyBatis 支持两级缓存:一级缓存(Local Cache)和二级缓存(Global Cache),通过这两级缓存可以有效地减少数据库的访问次数,提高应用性能。
282 1
|
2月前
|
存储 缓存 Java
【MyBaits】4、延迟加载、MyBatis 的缓存
【MyBaits】4、延迟加载、MyBatis 的缓存
22 0
|
3月前
|
SQL 缓存 Java
mybatis缓存详解
mybatis缓存详解
24 0
|
4月前
|
缓存 Java 数据库连接
mybatis的缓存内容(下)
mybatis的缓存内容
30 0
|
4月前
|
SQL 缓存 Java
mybatis的缓存内容(上)
mybatis的缓存内容
31 0
|
4月前
|
缓存 Java 数据库连接