使用rewriteBatchedStatements属性优化Mybatis-Plus批量插入数据(转)

原文:https://blog.csdn.net/mcband/article/details/131530297

前言
由于项目是使用MyBatis-Plus开发的,用起来也确实比较方便,尤其是service层封装好的一些通用的增删改查方法,省去了不少sql语句的书写,但是在开发过程中,我也发现MyBatis-Plus的saveBatch批量插入方法针对MySQL数据库可能会出现效率贼低的情况,通过不断查询资料发现可以通过加rewriteBatchedStatements参数来解决(保证5.1.13以上版本)。

一、rewriteBatchedStatements参数介绍

MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL,另外这个选项对INSERT/UPDATE/DELETE都有效

如果你去看源码

会发现,默认的saveBatch方法,是通过for循环一条一条执行了 sqlSession.insert,下面的 consumer 执行的就是上面的 sqlSession.insert:

 然后累计一定数量后,一批 flush。从这点来看,这个 saveBach 的性能肯定比直接一条一条 insert 快。
添加rewriteBatchedStatements=true这个参数后,会进入下面这个方法,对SQL 语句进行rewrite

二、批量添加员工信息测试

1.普通saveBatch批量插入

我们循环1万次,把每个实例员工对象装到员工集合(List)中,然后调用Mybatis-Plus的saveBatch方法,传入List集合,实现批量员工的插入,然后我们在方法开始结束的地方,计算当前函数执行时长。

@PostMapping("/addBath")
@ResponseBody
public ApiResult<Employee> addBath(){long startTime = System.currentTimeMillis();List<Employee> list = new ArrayList<>();// 循环批量添加1万条员工数据for (int i = 0; i < 10000; i++) {Employee employee = new Employee();employee.setName("DT测试"+i);employee.setAge(20);employee.setSalary(9000D);employee.setDepartmentId(i);list.add(employee);}boolean batch = employeeService.saveBatch(list);if(batch){long endTime = System.currentTimeMillis();System.out.println("函数执行时间:" + (endTime - startTime) + "ms");return ApiResult.ok();}return ApiResult.fail();
}

 

为了测试的细致,我多点了几下这个方法,下面是每次记录的时长:

批量添加1万条员工数据,测试结果如下:

第一次:(2秒多)

 第二次:(接近2秒)

 第三次:(接近2秒)

 差不多添加1万条数据在2秒左右,这个时候我们加大量10万条,再测试:

 

批量添加10万条员工数据,测试结果如下:

第一次:(19.341 秒)

 第二次:(18.298 秒)

 

2.设置rewriteBatchedStatements=true批量插入

下面我们为数据库的连接加上rewriteBatchedStatements=true的属性,再测试批量加入的耗时。

批量添加1万条员工数据,测试结果如下:

 对比默认插入:1万条数据:2s -->>> 0.5s

批量添加10万条员工数据,测试结果如下:

 对比默认插入:10万条数据:20s -->>> 5s

总结
所以,通过以上测试我们能发现,加了rewriteBatchedStatements的saveBatch要比默认的saveBatch快好几倍,如果你想验证rewriteBatchedStatements在你的系统里是否已经生效,记得要使用较大的batch,这样才能更明显的看出差距.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS中span元素垂直居中【解决span元素内基线对齐问题】

CSS中span元素垂直居中【解决span元素内基线对齐问题】 在样式的书写中,我们常常使用以下方式实现垂直居中,若span元素内例外,解决办法看文章最后 <div class="parent"><span class="child">text</span> </div>1.flex布局方式垂…

【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks

问题现象 客户将一个100G的表的数据插入到另一个表中,使用insert into select插入数据。从第一天下午2点开始执行,到第二天上午10点,一直未执行完毕。 由于需要实施下一步操作,客户kill重启了数据库,之后数据库一直回滚中,导致后续执行其他操作都报错YAS-02016 no free u…

用友U8 13.0填制凭证、查询明细账提示内存溢出

问题:用友U8 13.0填制凭证、查询明细账提示内存溢出解决办法:可能是由于系统缺少文件造成的。您可以按照以下步骤进行操作: 检查路径:C:\Program Files (x86)\Common Files\microsoft shared\DAO 中的控件是否缺少。 如果发现缺少文件,您可以从其他正常运行的机器上拷贝文…

清除 Nuxt 数据缓存:clearNuxtData

title: 清除 Nuxt 数据缓存:clearNuxtData date: 2024/8/6 updated: 2024/8/6 author: cmdragon excerpt: 摘要:本文详细介绍了Nuxt.js框架中的clearNuxtData方法,用于清除useAsyncData和useFetch缓存的数据、错误状态和待处理promises,以实现数据的实时更新和重载。通过…

京准电子:NTP网络时间服务器技术设计原理架构

京准电子:NTP网络时间服务器技术设计原理架构京准电子:NTP网络时间服务器技术设计原理架构 京准电子:NTP网络时间服务器技术设计原理架构 京准电子科技官微——ahjzsz NTP网络时间服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考,可为它…

laravel:从linux命令行运行command

一,创建command 1,执行命令 liuhongdi@lhdpc:/data/api$ php artisan make:command IndexAllCommand 2,查看创建的文件: <?phpnamespace App\Console\Commands;use Illuminate\Console\Command;class IndexAllCommand extends Command {/*** The name and signature of th…

String,StringBuilder,StringBuffer

目录String类创建字符串字符串长度连接字符串创建格式化字符串字符串常量池常见方法charAt(int index)startWith()endsWithsubstring()split()trim()concat()正则表达式正则表达式实例字符通配符次数通配符其他通配符java.util.regex 包捕获组StringBuffer和StringBuilderStrin…

IEC104初学者教程,第八章:总召唤流程详解

第八章:总召唤流程详解平时学习规约或调试IEC104或IEC101设备,需要IEC104/101模拟器,推荐一款: 主站下载地址:IEC104主站模拟器 从站下载地址:IEC104从站模拟器IEC 60870-5-104(简称IEC104)是一种用于远程控制和监控系统的通信协议。它广泛应用于电力系统和其他工业自动…

IEC104初学者教程,第九章:计数量召唤流程详解

第九章:计数量召唤流程详解平时学习规约或调试IEC104或IEC101设备,需要IEC104/101模拟器,推荐一款: 主站下载地址:IEC104主站模拟器 从站下载地址:IEC104从站模拟器在IEC 60870-5-104(简称IEC104)协议中,计数量召唤(Counter Interrogation,简称CI)是一种特定的功能…

windows下RabbitMQ安装后,无法进入web管理页面问题

在window安装rabbitmq,访问http://127.0.0.1:15672/,访问不了;有可能是没开启网页管理界面 1、在cmd窗口下进入rabbitmq安装目录下的sbin目录,使用rabbitmq-plugins.bat list查看已安装的插件列表。 2、使用rabbitmq-plugins.bat enable rabbitmq_management开启网页管理界…

热烈祝贺华企盾科技获得ISO/IEC 27001信息安全管理体系认证证书!

近日,北京华企盾科技有限责任公司顺利通过权威认证机构的严格审核,获得“ISO/IEC 27001信息安全管理体系认证证书”。认证范围涵盖与计算机软硬件销售及软件运维相关的信息安全管理活动等。信息安全管理实用规则ISO/IEC 27001是国际上具有代表性的信息安全管理体系标准,已在…