首页 > 其他分享 >MyBatis(二六):缓存——缓存原理

MyBatis(二六):缓存——缓存原理

时间:2022-09-18 14:56:09浏览次数:81  
标签:缓存 二六 System 查询 println 二级缓存 MyBatis out

首先来思考一下,在开启了二级缓存的情况下,一个用户查询数据经历的过程是什么样的。

我们看一下,下面这张图:

 

用户先去二级缓存中去寻找数据,如果找不到再去一级缓存寻找数据,如果还是找不到那么去数据库中进行查询。

我么具体来看一下:

@Test
    public void getUserById() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUserById(10001);
        System.out.println(user);
        sqlSession.close();
        System.out.println("=========================================");
        SqlSession sqlSession1 = MyBatisUtil.getSqlSession();
        UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
        User user1 = userMapper1.getUserById(10001);
        System.out.println(user1);
        sqlSession1.close();
        System.out.println("=========================================");
        SqlSession sqlSession2 = MyBatisUtil.getSqlSession();
        UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
        User user2 = userMapper2.getUserById(10003);
        System.out.println(user2);
        System.out.println("=========================================");
        User user3 = userMapper2.getUserById(10003);
        System.out.println(user3);
        sqlSession2.close();
    }

第一次查询由于二级缓存和一级缓存中都没有,所以要进数据库查询;第二次查询与第一次查询的数据相同,但不在同一个SqlSession中,并且第一次的SqlSession已经关闭,所以这次查询直接从二级缓存中找到数据;第三次查询与前两次查询都不同,所以二级缓存一级缓存都找不到数据,需要进数据库查询;第四次查询与第三次查询相同,并且在同一个SqlSession中,所以二级缓存没有需要的数据,在一级缓存中找到数据。

所以以上测试应该是只需要第一第三访问两次数据库,第二次是从二级缓存获取,第四次是从一级缓存获取。

测试结果:

 

 没有问题。

 

(本文仅作个人学习记录用,如有纰漏敬请指正)

标签:缓存,二六,System,查询,println,二级缓存,MyBatis,out
From: https://www.cnblogs.com/jmsstudy/p/16704358.html

相关文章

  • MyBatis(二五):缓存——二级缓存
    上一篇我们学习了一级缓存,这次我们来学习二级缓存。一、什么是二级缓存二级缓存也叫全局缓存,是namespace级别的缓存,每一个命名空间对应一个二级缓存。二、二级缓存的工......
  • 05--Redis高级:持久化、主从复制、哨兵、集群、redis做缓存
    1redis持久化#持久化redis的所有数据保存在内存中,对数据更新将异步的保存到硬盘上#实现方式#1.快照(全量复制):某时某刻数据的一个完整备份-mysql的......
  • MyBatis
    MyBatis持久层开发MyBatis配置文件<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://myb......
  • Redis缓存查询(防缓存击穿)
    @GetMapping("getResourceByConsumer")publicAPIResponsegetResourceByConsumer(StringconsumerId){Stringerror="";try{List......
  • MyBatis-Plus插入值后返回主键
    LZ做练手设计的时候有这样一个订单需求,先插入订单表数据(t_order),再写入订单详情表(t_orderDetail),详情表需要有一个与t_order的外键约束t_order(oid   auto_in......
  • SpringBoot + Caffeine实现本地缓存(内存缓存)
    1.Caffeine简介  Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。借鉴GoogleGuava和ConcurrentLinkedHashMap的经验,实现内存缓存。  缓存和......
  • Mybatist-plus在开发过程中遇到的问题和解决办法
    1,总是老忘记一些LambdaQueryWrapper常用的表达式   2,minmaxsum等聚合函数的查询方法QueryWrapper<ParagonPrintLog>queryWrapper=newQueryWrappe......
  • 分页查询,redis缓存分页数据,redis双重检测
    StringpageKey=RedisKeyManagement.getKey(RedisKeyManagement.ACTIVITY_BAISHI_PAGE_CACHE,Arrays.asList(activityId.toString(),String.valueOf(current)));......
  • 浏览器缓存机制介绍与缓存策略剖析
    缓存可以减少网络IO消耗,提高访问速度。浏览器缓存是一种操作简单、效果显著的前端性能优化手段。对于这个操作的必要性,Chrome官方给出的解释似乎更有说服力一些:很多时......
  • net core IMemoryCache 实现缓存
    1.Nuget包添加Microsoft.Extensions.Caching.Memory程序包2.Startup.cs类 ConfigureServices方法引用服务services.AddMemoryCache();  3. 在构造函数中请求I......