当前位置: 首页 > news >正文

Mybatis源码(3) - Executor执行过程 | 一级缓存 | 二级缓存

      • 0. 前言:
      • 1. CachingExecutor#query:
        • 1.1. BoundSql:
        • 1.2. CacheKey:
        • 1.3. 二级缓存:
        • 1.4. 一级缓存:
      • 2. JDBC过程执行:
      • 3. 结果集处理:
      • 4. Mybatis的一级缓存、二级缓存区别:

0. 前言:

  • Mybatis源码(1) - SpringBoot整合Mybatis的核心原理  | Mybatis源码(2) - SqlSessionTemplate的介绍及创建过程
  • 之前的文章介绍之后,我们知道SQL语句最终通过DefaultSqlSession的执行器Executor进行操作,默认是CachingExecutor

在这里插入图片描述

  • 接下来看看如何进行JDBC数据库操作的

1. CachingExecutor#query:

1.1. BoundSql:

  • 自动配置的时候会将Mapper.xml的映射文件的语句解析成BoundSql封装到MappedStatement里
  • BoundSql里的SQL是已经占位符替换了的,并且记录由参数映射关系以及入参值

在这里插入图片描述

1.2. CacheKey:

  • 作为一级缓存的key,主要包含MappedStatementId,分页Offset,分页Limit,boundSql语句,sql语句参数值

在这里插入图片描述

1.3. 二级缓存:

  • 如果在Mapper.xml中配置了,也就是配置二级缓存,那么会先查二级缓存,再查一级缓存
  • 二级缓存是namespace级别,也就是Mapper级别的,默认是不开启的,也很少会用到二级缓存,就不多赘述

在这里插入图片描述

1.4. 一级缓存:

  • CachingExecutor是装饰了Executor,默认Executor的实现是BaseExecutor,针对不同场景又有三种子类,默认SimpleExecutor

在这里插入图片描述

  • BaseExecutor持有真正储存的一级缓存LocalCache(基于PerpetualCache的HasMap<CacheKey,结果List>)

在这里插入图片描述

  • 没有命中一级缓存则取去查询数据库,调用子类SimpleExecutor的doQuery实现方法

在这里插入图片描述

2. JDBC过程执行:

  • SimpleExecutor的doQuery方法,就会进行JDBC的相关操作
  • 如建立Connection,创建Statement语句,然后执行,处理结果等
public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {Statement stmt = null;try {// 获取配置对象Configuration configuration = ms.getConfiguration();// 创建StatementHandler对象,实际返回的是RoutingStatementHandler对象StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);// 完成Statement的创建和初始化stmt = prepareStatement(handler, ms.getStatementLog());// 调用query方法执行sql语句,并通过ResultSetHandler完成结果集的映射return handler.query(stmt, resultHandler);} finally {// 关闭Statement对象closeStatement(stmt);}
}public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {PreparedStatement ps = (PreparedStatement) statement;//执行SQLps.execute();//处理返回结果return resultSetHandler.handleResultSets(ps);}

3. 结果集处理:

  • 根据ResultMap的类型找到对应的类型处理handler,然后根据返回结果类型调用 constructor.newInstance()创建结果对象
  • 然后解析属性名,利用反射不同字段对应的value设置到Java对象中
public List<Object> handleResultSets(Statement stmt) throws SQLException {ErrorContext.instance().activity("handling results").object(mappedStatement.getId());// 该集合用于保存映射结果得到的结果对象final List<Object> multipleResults = new ArrayList<>();int resultSetCount = 0;// 获取第一个ResultSet对象ResultSetWrapper rsw = getFirstResultSet(stmt);// 获取MappedStatement.resultMaps集合List<ResultMap> resultMaps = mappedStatement.getResultMaps();int resultMapCount = resultMaps.size();// 如果集合集不为空,则resultMaps集合不能为空,否则抛出异常validateResultMapsCount(rsw, resultMapCount);// 遍历resultMaps集合while (rsw != null && resultMapCount > resultSetCount) {// 获取该结果集对应的ResultMap对象ResultMap resultMap = resultMaps.get(resultSetCount);// 根据ResultMap中定义的映射规则对ResultSet进行映射,并将映射的结果对象添加到multipleResult集合中保存handleResultSet(rsw, resultMap, multipleResults, null);// 获取下一个结果集rsw = getNextResultSet(stmt);// 清空nestedResultObjects集合cleanUpAfterHandlingResultSet();// 递增resultSetCountresultSetCount++;}// 获取MappedStatement.resultSets属性,该属性对多结果集的情况使用,该属性将列出语句执行后返回的结果集,并给每个结果集一个名称,名称是逗号分隔的,String[] resultSets = mappedStatement.getResultSets();if (resultSets != null) {while (rsw != null && resultSetCount < resultSets.length) {// 根据resultSet的名称,获取未处理的ResultMappingResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]);if (parentMapping != null) {String nestedResultMapId = parentMapping.getNestedResultMapId();ResultMap resultMap = configuration.getResultMap(nestedResultMapId);// 根据ResultMap对象映射结果集handleResultSet(rsw, resultMap, null, parentMapping);}// 获取下一个结果集rsw = getNextResultSet(stmt);// 清空nestedResultObjects集合cleanUpAfterHandlingResultSet();// 递增resultSetCountresultSetCount++;}}return collapseSingleResultList(multipleResults);
}

4. Mybatis的一级缓存、二级缓存区别:

  • 一二级缓存都是基于PerpetualCache的 HashMap 本地缓存,一级缓存是SqlSession级别的,二级缓存是Mapper(Namespace)级别
  • 默认关闭二级缓存的,但是查询的时候会先查有没有开启二级缓存,有的话先查二级缓存再查一级缓存
  • 主要实现是SqlSession持有Executor,Executor的实现BaseExecutor,持有一级缓存LocalCache
  • 然后有个CachingExecutor会装饰Executor,也就是装饰一级缓存,查询时如果开启二级缓存,CachingExecutor会通过tcm去二级缓存查询,之后再查一级缓存

相关文章:

Mybatis源码(3) - Executor执行过程 | 一级缓存 | 二级缓存

0. 前言&#xff1a;1. CachingExecutor#query&#xff1a;1.1. BoundSql&#xff1a;1.2. CacheKey&#xff1a;1.3. 二级缓存&#xff1a;1.4. 一级缓存&#xff1a;2. JDBC过程执行&#xff1a;3. 结果集处理&#xff1a;4. Mybatis的一级缓存、二级缓存区别&#xff1a;0. …...

成为 Seatunnel 源码贡献者保姆级教程

Apache SeaTunnel 是下一代高性能、分布式、海量数据集成平台&#xff0c;已经在 B 站、腾讯云等 100 家公司生产使用。目前处于 incubator 阶段。作为公司内部使用的 ETL 工具&#xff0c;Seatunnel 可以基于已有的 Spark、Flink 计算平台进行数据交换也可以运行在 k8s 平台上…...

MySQL的索引视图练习题

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…...

【C++ Primer Plus】第四章:复合类型

文章目录4.1 数组C11数组初始化的方法4.2 字符串**cin是如何确定已完成字符串输入呢&#xff1f;****如何每次读取一行字符串输入&#xff1f;****面向行的输入&#xff1a;getline()****面向行的输入&#xff1a;get( )****为什么推荐使用get( )&#xff0c;而不是getline( )呢…...

做外贸,你不能不懂的外贸流程知识

报关是履行海关进出境手续的必要环节之一&#xff0c;涉及两大类:进出境运输工具、物品和货物。由于性质不同&#xff0c;报关手续也有些不同。今天我就为大家详细介绍一下进出口报关的流程&#xff0c;包括出口货物报关的流程&#xff0c;随报关单提交的运费和商业单据&#x…...

日本机载激光雷达测深进展(一)日本启动测量90%沿岸水深项目

海洋地图项目利用航空测深绘制日本90%沿海20m以浅区域&#xff0c;是日本海道协会&#xff08;JHA&#xff09;和日本财团的一个联合项目。 迄今为止&#xff0c;只有不到2%的日本沿海水域得到了测绘&#xff0c;严重拖累了在海洋事故、防灾减灾、篮碳以及生物多样性保护等领域…...

MySQL数据库调优————创建索引的原则和索引失效及解决方案

创建索引的原则 建议创建索引的场景 select语句&#xff0c;频繁作为where条件的字段update/delete语句的where条件需要分组、排序的字段distinct所使用的字段字段的值有唯一性约束对于多表查询&#xff0c;联接字段应创建索引&#xff0c;且类型无比保持一致 避免隐式转换 …...

设计师都在看的全球设计网站,你居然还不知道!

设计师需要拥有无限的创意和熟练的技巧&#xff0c;并且对行业的前景和客户的心理有一定的了解。要能达到“陌生化”之前&#xff0c;肯定是有知识储备&#xff0c;专业能力的前提要求&#xff0c;以及创新能力。 今天为大家整理了多个优秀全球设计网站&#xff0c;这些博客内…...

c++:缺省参数,函数重载

今天介绍的是cpp中的缺省参数以及函数重载的知识。 首先我们先看看缺省参数&#xff1a; 缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实 参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 例如&#…...

深度学习算法面试常问问题(二)

X86和ARM架构在深度学习侧的区别&#xff1f; X86和ARM架构分别应用于PC端和低功耗嵌入式设备&#xff0c;X86指令集很复杂&#xff0c;一条很长的指令就可以完成很多功能&#xff1b;而ARM指令集很精简&#xff0c;需要几条精简的短指令完成很多功能。 影响模型推理速度的因…...

美国CPC认证是什么?儿童玩具亚马逊CPC认证审核有哪些问题?

很多卖家都有遭遇listing下架&#xff0c;被要求提供CPC认证报告。这是因为亚马逊有时会加强对儿童产品的审查。本文带大家对CPC认证进行一个全面了解。什么是CPC认证&#xff1f;CPC认证&#xff0c;全称ChildrensProductCertification.是认可实验室&#xff0c;根据产品不同适…...

恭喜! SelectDB 五位开发者成为 Apache Doris 新晋 PMC 成员和 Committer!

近期&#xff0c;通过 Apache Doris 项目管理委员会的推荐与投票&#xff0c;Apache Doris 社区正式迎来了 2 位新晋 PMC 成员 和 8 位新晋 Committer 的加入。值得关注的是&#xff0c;2 位新晋 PMC 成员均来自 SelectDB&#xff0c;分别是衣国垒&#xff08;yiguolei&#xf…...

数据库面试题

第一范式&#xff08;1NF&#xff09; 第一范式是指数据库的每一列都是不可分割的基本数据项&#xff0c;而下面这样的就存在可分割的情况&#xff1a; 学生&#xff08;姓名&#xff0c;电话号码&#xff09; 电话号码实际上包括了家用座机电话和移动电话&#xff0c;因此它…...

[USACO2022-DEC-Bronze] T2 Feeding the Cows 题解

一、题目描述Farmer John has N (1≤N≤10^5) cows, the breed of each being either a Guernsey or a Holstein. They have lined up horizontally with the cows occupying positions labeled from 1…N.Farmer John 有 N&#xff08;1≤N≤105&#xff09;头奶牛&#xff0c…...

Unity法线贴图原理理解(为什么存在切线空间?存的值是什么?)

Unity法线贴图原理理解(为什么存在切线空间&#xff1f;存的值是什么&#xff1f;&#xff09;写在前面1、为什么用法线贴图&#xff1f;2、用什么存法线&#xff1f;3、法线向量为什么存在切线空间&#xff1f;法线贴图存得是什么&#xff1f;4、法线贴图为什么会偏蓝&#xf…...

【JavaWeb】传输层协议——UDP + TCP

目录 UDP协议 UDP协议结构 UDP的特点 TCP协议 TCP协议结构 TCP的特点 TCP的十个核心机制 确认应答 超时重传 连接管理 滑动窗口 流量控制 阻塞控制 延迟应答 捎带应答 粘包问题 异常处理 UDP协议 UDP协议结构 源端口&#xff1a;存储的是发送方的端口号。 目的…...

C++ 中是用来修饰:内置类型变量、自定义对象、成员函数、返回值、函数参数

const 是 constant 的缩写&#xff0c;本意是不变的&#xff0c;不易改变的意思。在 C 中是用来修饰内置类型变量&#xff0c;自定义对象&#xff0c;成员函数&#xff0c;返回值&#xff0c;函数参数。 一. const修饰 普通类型的变量 const int a 7; int b a; // 正确 …...

av 146 002

61. 一个新的敏捷项目经理正试图确定团队该如何执行一个发布计划的进度。哪种工具可以更深入地了解团队的进展? A. 发布计划系统 B. 产品路线图。 C. 看板。 D. 燃尽图 62. 你的项目发起人找到你&#xff0c;让你知道他正在考虑给你项目中的一位高级工程师颁发1000美元的现…...

小红书用户画像 | 小红书数据平台

小红书的用户画像是小红书品牌营销的必备技能&#xff0c;也是小红书推广种草的一个重要前提。通过对小红书用户画像进行分析&#xff0c;对品牌进行精准营销&#xff0c;实现更高的流量转化。 2022小红书粉丝人群画像 千瓜数据在2022年发布的千瓜活跃用户画像趋势报告中分析了…...

【STM32笔记】低功耗模式下GPIO、外设、时钟省电配置避坑

【STM32笔记】低功耗模式下GPIO、外设、时钟省电配置避坑 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置&#xff08;ADC唤醒无法使用、低功耗模式无法烧录解决方案&#xff09; blog.csdn.net/weixin_534033…...

Linux内存分区(swap)

目录 1、使用物理分区创建内存交换分区 2、使用文件创建内存交换文件 当硬件的设备资源充足的话&#xff0c;那么swap是不会被我们的系统所使用到的&#xff0c;所以swap会被利用到的时刻通常就是物理内存不足的情况 我们知道CPU所读取的数据都来自于内存&#xff0c;那么当…...

第六章——抽样分布

文章目录1、统计量的定义2、常用的统计量3、经验分布函数4、正态总体常用统计量的分布4.1、卡方分布4.1.1、卡方分布的定义4.1.2、卡方分布的性质4.2、t分布4.2.1、t分布的定义4.2.2、t分布的性质4.3、F分布4.3.1、F分布的定义4.3.2、F分布的性质5、正态总体的样本均值与样本方…...

蓝桥云课-声网编程赛(声网编程竞赛7月专场)题解

比赛题目快速链接&#xff1a;https://www.lanqiao.cn/contests/lqENT02/challenges/ 让时钟转起来&#xff08;考点&#xff1a;css&#xff1a;transform&#xff09; // index.js function main() {// 题解前理解一个东西&#xff1a;// 时针每过一小时&#xff0c;转30 原…...

Java高手速成 | Java web 实训之投票系统

01、投票系统的案例需求 在本篇中,我们将制作一个投票系统,让学生给自己喜爱的老师投票。该系统由1个界面组成,系统运行,出现投票界面,如图所示: ▍显示效果 在这个界面中,标题为:“欢迎给教师投票”;在界面上有一个表格,显示了各位教师的编号、姓名、得票数;其中…...

排序的基本概念

按数据存储介质&#xff1a;内部排序和外部排序按比较器个数&#xff1a;串行排序和并行排序按主要操作&#xff1a;比较排序和基数排序插入排序&#xff1a;基本思想&#xff1a;每步将一个待排序的对象&#xff0c;按其关键码大小&#xff0c;插入到前面已经排好序的一组对象…...

面试笔试资料--Java

这里写自定义目录标题1.同步和异步有何异同&#xff1f;在什么情况下分别使用他们&#xff1f;举例说明1.同步和异步有何异同&#xff1f;在什么情况下分别使用他们&#xff1f;举例说明 1.1概念 Java中交互方式分为同步和异步两种&#xff1a;   同步交互&#xff1a;指发送…...

基于TC377的MACL-ADC General配置解读

目录标题一、MACL-ADC General1.Config Variant与AdcConfigSet2. AdcGeneral3.AdcPublishedInformation二、最终对应达芬奇生成内容一、MACL-ADC General 1.Config Variant与AdcConfigSet Config Variant &#xff1a;变体配置&#xff0c;默认选择VariantPostBuild就好了&…...

error: src refspec master does not match any.处理方案

问题描述 在使用git bash指令将项目上传到github时&#xff0c;总是遇到一些错误无法解决。 下面是我遇到的一个问题 error: src refspec master does not match any. error: failed to push some refs to XXXX.git 原因分析&#xff1a; 错误&#xff1a;SRC ReFSPEC主控器不…...

防火墙有关iptables的知识点

基本概念 什么是防火墙 在计算中&#xff0c;防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描&#xff0c;这样能够过滤掉一些攻击&#xff0c;以免其在目标计算机…...

路肩石水渠机在施工公路项目中工艺特点的匹配

新建公路路肩项目在目前公路项目中的技术手段和实现方式,大多数依靠机械设备来机械来进行,还有一部分通过人工传统的预制作业和安装模式来进行,两种工艺特点的对比来说对于补充完善建设手段和效果实现有很重要的意义. 其中采用了机械设备进行一次成型制作的过程,按照设计需求匹…...

网站如何做会员通用/百度小说风云排行榜

最近要用WPF写一个树&#xff0c;同事给了我一个Demo&#xff08;不知道是从哪里找来的&#xff09;&#xff0c;我基本上就是参照了这个Demo。 先放一下效果图&#xff08;3棵树&#xff09;&#xff1a; 这个树索要满足的条件是&#xff1a; 父节点.Checkedtrue时&#xff0c…...

肇庆企业建站程序/四川全网推网络推广

int main() {int max, i 0, sum 0; scanf(\ while(sum < max) {i; sum i; }printf(\}第六周作业数字正方型成绩 折扣 10 开启时间 2014年11月12日 星期三 05:55 0.8 折扣时间 2014年11月26日 星期三 05:55 关闭时间 2014年12月3日 星期三 05:55 允许迟交 否 这是双重循环…...

广州网站建设哪家专业/google网站增加关键词

目录前言OpenCV 学习总结.番外篇 cv::dnn::blobFromImage()python中的图像预处理常用的图像预处理方法强大的NumpyYOLOX通过Numpy进行预处理被埋没的cv2.dnn.blobFromImage()C中的图像预处理Mat数据重排懒人必备之cv::dnn::blobFromImage()接口前言 部署基于深度学习的CV算法时…...

做音频的网站/百度云搜索引擎官网

写在前面 个人学习记录之作。仅供参考。 相关资料 关于多模态&#xff0c;其实这个图片已经基本上说尽了。 然后特别推荐B站李沐大神的论文讲解&#xff1a;多模态论文串讲上【论文精读46】 论文地址&#xff1a;https://arxiv.org/abs/2102.03334 论文代码地址&#xff1…...

wordpress rss 下一页/培训机构排名前十

# redis笔记 ## 一、什么是NoSQL ### 1、NoSQL概述 - NoSQL(NoSQL Not Only SQL)&#xff0c;意即“不仅仅是SQL”&#xff0c;是一项全新的数据库理念&#xff0c;泛指非关系型的数据库。 - 随着互联网web2.0网站的兴起&#xff0c;传…...

网站开发合同 doc/网络服务商电话

排队论模型&#xff08;一&#xff09;&#xff1a;基本概念、输入过程与服务时间的常用概率分布 排队论模型&#xff08;二&#xff09;&#xff1a;生灭过程 、 M / M /s 等待制排队模型、多服务台模型 排队论模型&#xff08;三&#xff09;&#xff1a;M / M / s/ s 损失…...