解决Mybatis-Plus批量插入数据太慢,堪称神速

48 篇文章 7 订阅
44 篇文章 2 订阅
本文介绍了在使用Mybatis-Plus进行批量插入时,通过设置MySQL JDBC连接URL的rewriteBatchedStatements=true参数,可以显著提高批量插入的性能。在未开启此参数时,批量插入耗时较长,如10万条数据可能需要20秒。而开启后,10万条数据的插入时间降至5秒,实现了性能的飞跃。测试结果证明了该参数对于批量操作的重要性。
摘要由CSDN通过智能技术生成

#前言
用过Mybatis-Plus的小伙伴一定知道他有很多API提供给我们使用,真爽,再不用写那么多繁琐的SQL语句,saveBatch是Plus的批量插入函数,大家平时工作肯定都用过,下面我们就来一个案例进入今天的主题。


一、rewriteBatchedStatements参数

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

添加rewriteBatchedStatements=true这个参数后的执行速度比较:
我这里总结了一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!
需要的可以点击领取福利,扫码即可免费领取
请添加图片描述

二、批量添加员工信息

1.普通saveBatch批量插入

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

@PostMapping("/addBath")
@ResponseBody
public CommonResult<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 CommonResult.success();
    }
    return CommonResult.error();
}

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

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

第一次:(2秒多)

第二次:(接近2秒)

第三次:(接近2秒)

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

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

第一次:(19.341 秒)

第二次:(18.298 秒)

顿时我傻了,10万条数据批量添加要20秒左右,这要是再加个10万条,那不崩掉,于是我就各种找解决方案,最后锁定一个数据库连接的属性rewriteBatchedStatements,下面我们就添加上该属性试试速度与激情。

2.设置rewriteBatchedStatements=true批量插入

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

rewriteBatchedStatements=true

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

在这里插入图片描述
质的飞跃啊!牛逼,可以看出批处理的速度还是非常给力的。

1万条数据:2s -->>> 0.5s

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

在这里插入图片描述

效果惊呆了吧???直接起飞啊。

1万条数据:20s -->>> 5s

总结

所以,如果你想验证rewriteBatchedStatements在你的系统里是否已经生效,记得要使用较大的batch

👇🏻 添加 博主 获取更多资料👇🏻
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值