rewriteBatchedStatements神秘属性

  • 前言
  • 一、rewriteBatchedStatements参数
  • 二、批量添加员工信息
    • 1.普通saveBatch批量插入
    • 2.设置rewriteBatchedStatements=true批量插入
  • 总结

前言

最近小编手上一堆项目,实在特别忙,每天一堆批量操作,更新、导入、新增、删除,公司使用的Mybatis-Plus操作SQL,用过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这个参数后的执行速度比较:

二、批量添加员工信息

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,以上就是我的这次总结了,如果有更好的,或者更专业的记得留下你的指教呀~

Mybatis-Plus批量插入数据太慢,使用rewriteBatchedStatements属性优化,堪称速度与激情!相关推荐

  1. 使用mybatis plus批量插入数据

    之前用mybaits插入数据时,需要在sql语句中作特殊的处理,然后才能够批量插入数据. 今天试验了一下mybatis plus的批量插入方式,简直太简单了,太爽了,真真切切的体会到了科技就是生产力. ...

  2. Java通过Mybatis实现批量插入数据到Oracle中

    最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式: 结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目 ...

  3. spring boot + mybatis实现批量插入数据

    场景描述:前端以List的形式传入多条待插入数据,调用mybatis-generator自动生成的insert接口一次只能插入一条数据,当然可以写一个for循环一条条插入,但感觉效率太低:所以尝试下一 ...

  4. oracle批量插入报错,MyBatis Oracle批量插入数据

    导语:在开发中或多或少都会遇到数据批量插入的功能,最近我在做项目的过程中就遇到了这样一个问题.上传Excel文件,解析文件内容并将解析的内容插入数据库. 思路分析 1.解析Excel文件 Excel文 ...

  5. springmvc+mybatis+ajax 批量插入数据

    2019独角兽企业重金招聘Python工程师标准>>> 批量插入.AJAX发起请求,核心代码如下: var mids = new Array(); for (var i=0; i&l ...

  6. Mybatis如何批量插入数据?

        有一小段时间没有写技术博文了,今天我又来更新啦

  7. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  8. oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...

    本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...

  9. mybatis批量插入oracle报表达式,mybatis oracle两种方式批量插入数据

    mybatis在oracle中批量插入数据时,单次批量大小有限制,批量插入时,单次批量过大,也会影响插入性能.故程序端也需要对应的限制. BEGIN insert into blacklist (id ...

最新文章

  1. grub中mbr的程序
  2. sed实例(持续更新)
  3. Java传xml时字符串乱码_php调用java传递xml字符串乱码怎么办
  4. keras保存模型_TF2 8.模型保存与加载
  5. WebAPI性能监控-MiniProfiler与Swagger集成
  6. PyTorch 深度学习:31分钟快速入门——Batch Normalization
  7. AI 快车道目标检测专场, PaddlePaddle “深度干货”
  8. pod配置Liveness和Readiness探针
  9. 技术改变世界以及减速慢行
  10. xp如何修改SID.
  11. python 爬取 全网代理 IP 网站 + 破解端口加密混淆
  12. IE-LAB网络实验室:HCNP培训机构 HCIE培训中心 HCIE认证培训 HCNA培训 华为面试考试时需要注意什么
  13. 如何用计算机名安装打印机,如何添加打印机,教您添加共享打印机的方法
  14. 词根词缀spers/spher/spir/spond等词根衍生的单词
  15. KEIL5 AC6 出现printf告警
  16. 蚂蚁金服是不是中国最好的 FinTech(金融科技)公司
  17. 凌动z3735f运行64位linux,在z3735上装ubuntu,装完的经验
  18. 怎样分析数据致提高产出?(三)
  19. 如何更改JupyterLab Jupyter Notebook的工作路径
  20. 读书 | 每天演好一个情绪稳定的成年人

热门文章

  1. 退出出库复核是什么意思_电商仓储与传统仓储有什么不同?
  2. 代码更换ui图片_不同人眼中的UI设计师都是什么样的?
  3. 信息学奥赛一本通(1412:二进制分类)
  4. 常用技巧 —— 打表规律
  5. 病毒(信息学奥赛一本通-T1396)
  6. 数字金字塔(信息学奥赛一本通-T1258)
  7. 分数线划定(信息学奥赛一本通-T1180)
  8. mysql php 流式读取_PHP MySQL 读取数据
  9. Scala的异常操作
  10. js时间搓化为今天明天_来揭秘化妆品为啥会搓泥?