MyBatis批量插入数据优化,新增参数大幅提升操作效率

news2024/9/20 19:34:31

项目中进行接口压测,发现批量插入的速度有点超出预期,感觉很奇怪,经过定位后发现mybatise-plus批量保存的处理十分缓慢,使用的是saveBatch方法,这点有点想不通。于是就进行了相关内容分析。

根据mybatise-plus中saveBatch的方法进行源码查看:

3460ba39b987f21083b19e1440b791f5.jpeg

继续跟踪逻辑,从代码上看,确实是一条条执行了sqlSession.insert(sqlStatement, entity) 方法。


471e80ab64c859079df5fc21786360e7.jpeg

继续跟踪,下面的consumer执行的就是上面的sqlSession.insert方法:

9d8db746d696c80740ec7c636048d07d.jpeg

具体执行逻辑中是累计到 一定数量后,一批数据进行flush。

其实,从上述的代码实现上看,整个实现机制跟我们预想的差不多,基本上是批量的实现思路。这种批量的处理肯定比一条条的insert要快。

但是,为什么还是如此的缓慢。

下面我们就进行一个粗略的实验,来对比一波。现在使用4种方式进行比较:

1、批量数据单条执行,调用myBatise方法save

2、批量执行调用myBatise方法saveBatch

3、通过xml手写sql批量插入

4、JDBC方式批量插入开始进行实验


1、1000条数据,一条条的插入


995c849cbf223e02f33bec3a1778df3e.jpeg

执行结果为:

fc98fe8de36587678b79a6a7fac01c93.jpeg

可以看到,执行一批1000条点的数据,耗费时间为1173毫秒。

2、1000条数据,使用mybatise-plus的saveBatch插入


bc10b96148ef40829a3e476768cf7fa4.jpeg

执行结果为:

fc75ebba250fe3f62ade3ea3dd844eb4.jpeg

可以看到,本次总的耗时为289毫秒,比一条条的插入快了大约4倍,效率还是可以的。

3、通过xml手写sql批量插入。

Xml中拼接内容为:


00af06db27e3fc2cacbb182695751721.jpeg

Java代码内容为:

6664ade448b90f06b1f7320d5f73e408.jpeg

执行程序看下性能如何:

29d3b069c4fe9d35bfd6243ea8b3b979.jpeg

本次耗时只有34毫秒,性能比saveBatch提高了7倍

4、JDBC方式批量插入开始进行实验


c003ca8f9b93500447dd953d19d85806.jpeg

执行情况:

c99ad927194bfb98280636031f60d00f.jpeg

本次耗时142毫秒,

执行效率比saveBatch要快,比手动拼接方式要慢,

综上所述,手动拼接sql的方式是批量保存效率最佳。

5、结论

整个执行结果跟预期的不一样,这里我们直接说结论,因为mybatise-plus的saveBatch方法会继续调用mysql驱动中的实现,

在Mysql的驱动jar中,ClientPreparedStatement.java中executeBatchInternal()方法中


1f030576345fb46294ce1f2e476417f2.jpeg

就是这个叫 rewriteBatchedStatements 的属性,从名字来看是要重写批操作的 Statement,前面batchHasPlainStatements 已经是 false,取反肯定是 true,所以只要这参数是 true 就会进行一波操作。

属性默认是 false。

可以直接将 jdbcurl 加上了这个参数:

看下 executeBatchedInserts 究竟干了什么,在上面基础上继续执行逻辑,

果然,sql语句倍rewrite了:

对于插入而言,所谓的rewrite其实就是将一批插入拼接成insert into XXX values(a),(b)…

这样的一条语句形式后再执行,这样一来跟拼接sql的效果是一样的。

那么,为什么默认不给这个rewriteBatchedStatements属性设置为true,

原来有如下原因:

看下 executeBatchedInserts 究竟干了什么:

1. 如果批量语句中的某些语句失败,则默认重写会导致所有语句都失败。

2. 批量语句的某些语句参数不一样,则默认重写会使得查询缓存未命中。

看起来影响不大,所以我给我的项目设置上了这个参数!

最后我稍微总结下粗略的对比:大家如果想要更准确的实现,可以自己进行更多组数据测试:

395499984c41d187f1e49df298a83131.jpeg

以如果有使用 jdbc 的 Batch 性能方面的需求,要将 rewriteBatchedStatements 设置为 true,这样能提高很多性能。


然后如果喜欢手动拼接 sql 要注意一次拼接的数量,分批处理。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1153620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ecplise中导入或更新项目之后出现的jsp文件一直显示红叉

解决办法:右键---build path或者properties中找java build path 先检查项目本身的jre版本是不是不与你本身的加热版本相同,如果不相同,则选中这个jre Systemlibrary -----右边有一个remove删除点。。。 (2)重新添加一…

(自适应手机端)厨师招聘信息发布类网站模板

(自适应手机端)厨师招聘信息发布类网站模板 PbootCMS内核开发的网站模板,该模板适用于信息发布网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可; 自适应手机端,同一个后台,数据即时同…

chatgpt中文翻译英文

chatgpt中文翻译英文 chatgpt很适合用于将翻译英文,在英文论文写作上,日常翻译任务都有很大帮助。 使用方法 给出下面这段话: 下面我让你来充当翻译家,你的目标是把中文翻译成英文,请翻译时不要带翻译腔&#xff0c…

灯串上亚马逊加拿大合规标准CSA认证如何办理?

灯串 灯串和配件都是插头连接的便携式、临时性商品,最大额定输入电压为 120 伏。 本政策适用于季节性照明、装饰性灯具以及灯串。 亚马逊灯串政策 根据亚马逊的要求,所有季节性和装饰性灯串均应经过检测,并且遵守下列法规、标准和要求&…

【数电知识点_2023.10.28】

数制与码制 十进制转二进制 8 bits 1 Byte 2|12 //121100自下而上 商为0为止 2|_ 6_…0 2|_ 3_…0 2|1…1 0…1 0.375 //0.3750.011自上而下 小数点为0为止 x 2 ———— 0.75…0 x 2 ———— 1.5…1 x 2 ———— 1…1 BCD码:每4位二进制表示一位十进制 8421…

装修怎么快速除甲醛 房间装修除装修异味方法

装修怎么快速除甲醛 房间装修除装修异味方法 甲醛问题在装修中引起关注,装修房子是每个家庭都会经历的事情,而甲醛污染也是其中的一个难题。甲醛是一种有害物质,对人体健康造成严重影响,尤其对婴幼儿更为敏感。在装修过程中&#…

从零开始学习PX4源码0(固件下载及编译)

目录 文章目录 目录摘要1.重点学习网址2.固件下载1.下载最新版本固件2.下载之前版本固件 摘要 本节主要记录从零开始学习PX4源码1(固件下载)的过程,欢迎批评指正!!! 下载固件主要分为两个版本,之前稳定版本和最新官网…

【C++项目】高并发内存池项目第八讲 项目总结和面试问题分享

项目总结面试分享 1.项目总结1.1优点1.2不足1.3面试常见问题 2.面试分享项目部分C语法部分 项目源代码:高并发内存池 1.项目总结 1.1优点 增加动态申请的效率减少陷入内核的次数减少系统内存碎片提升内存使用率尽量减少锁竞争应用于多核多线程场景 1.2不足 当前…

西南建筑电气年会暨大运场馆电气设计技术论坛-安科瑞 蒋静

2023年10月19-20日,由中国建筑西南设计研究院有限公司、西南建筑电气工程设计情报网、四川省土木建筑学会建筑电气专业委员会、四川省电工技术学会工业与建筑供电专业委员会、建筑电气杂志社联合主办的第九届(2023年)“西南建筑电气年会暨大运场馆电气设计技术论坛”…

C/C++ “variable set but not used“的 警告问题解决方案

在编程的过程中,会有一些预留的变量暂时不用,但是编译过程编译器警告 会报错无法编译通过针对这个问题,采用下面的解决方案比较方便。 错误如下形式: 三种解决方法: 1.可以在变量前加上(void)就…

怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)

企业沟通工具的普及,越来越多的企业开始使用钉钉作为内部沟通工具。然而,对于企业管理者来说,如何监控钉钉聊天记录内容成为了一个重要的问题。本文将介绍几种方法,帮助企业管理者实现监控钉钉聊天记录内容的目的。 一、钉钉自带功…

《研发效能(DevOps)工程师》课程简介(二)丨IDCF

为贯彻落实《关于深化人才发展体制机制改革的意见》,推动实施人才强国战略,促进专业技术人员提升职业素养、补充新知识新技能,实现人力资源深度开发,推动经济社会全面发展,根据《中华人民共和国劳动法》有关规定&#…

sqlserver 数据迁移之bcp

BCP(Bulk Copy Program)是 SQL Server 中用于大量数据导入和导出的工具。在进行数据迁移时,我们可以使用 BCP 来提高数据迁移的效率和性能。以下是一些优化 BCP 的常见方法: 1.使用合适的数据类型: 在导出和导入数据…

Docker 运行swagger-editor实现在线接口文档维护与调试

文章目录 一、序二, Docker部署准备1. 编辑docker-compose.yml2. 新增启动、停止脚本3. 样例 swagger.yaml 三, 启动swagger-editor1. 使用说明2. 完整代码备份 一、序 因工作需要,需要搭建python运行环境,项目中python基于flask…

​测绘人注意,你可能会改变历史!

你也许想不到,曾经有一个测绘人员在进行实地测量作业时,在地图上就这么随手一标注,却让这个地方成为了如今的网红打卡地。 这个地方就是外地游客慕名而来的“宽窄巷子”,如果连这个地方都不知道的成都人,就应该不能算…

后期云端制作:激发影视行业创新力的新时代

在前几年,全球疫情席卷而来,许多影视项目不得不陷入停滞。但是,有一部分影视人却不甘被困,他们选择了一种全新的“云”工作方式。这种方式不仅能够提供制作、存储和处理平台,而且还将推动影视行业的创新与发展。今天&a…

系列四、Springboot中使用DevTools

一、概述 日常开发中&#xff0c;修改了一个类的很小一部分&#xff0c;例如HelloService中有这样的一个方法listAllCity()&#xff0c;代码如下&#xff1a; Service public class HelloService {public List<String> listAllCity() {List<String> cities Arrays…

oracle (9)Storage Relationship Strut

Storage & Relationship Strut 存储和关系支柱 目标&#xff1a; 描述数据库的逻辑结构列出段类型其用途列出控制块空间使用的关键字获取存储结构信息 一、基础知识 1、数据库逻辑结构图 2、Types of Segments 段的类型 3、Storage Clause Precedence 存储条款的优先顺序 …

edge浏览器的隐藏功能

1. edge://version 查看版本信息 2. edge://flags 特性界面 具体到某一特性&#xff1a;edge://flags/#overlay-scrollbars 3. edge://settings设置界面 详情可参考chrome: 4. edge://extensions 扩展程序页面 5. edge://net-internals 网络事件信息 6. edge://component…

【Java之家-编程的衣柜】线程的基础知识及线程与进程的联系

认识线程 线程是什么 一个线程就是一个 “执行流”. 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 “同时” 执行 着多份代码. 轻量级进程 -> 线程&#xff08;Thread&#xff09; 为什么要有线程 首先&#xff0c;“并发编程”成为“刚需” 其次, 虽然多进…