最近对myBatis-plus 中的两个批量新增方法进行了简单的性能测试,并尝试对其进行优化。
第一个批量新增方法是在Mapper.xml 文件中使用标签页 和 实现批量新增,
后文中我把这种方式简单称为ForEach新增。
第二个批量新增方法是使用 myBatis-plus 提供的 ServiceImpl类中的 saveBatch 方法实现批量新增,后文中我把这种方式简单称为 saveBatch 新增。
本次性能测试的数据只适用于个人电脑配置。
相关配置参数:
操作系统: windows 11, jdk : 1.8 ,处理器:AMD Ryzen 7 5800H(8核16线程),内存 13.9GB,
MySQL版本: 8.0.23,MyBatis-plus 版本: 3.4.3 ,mysql-connector-java dependency依赖版本: 8.0.23,连接池 :springboot 自带 HikariCP
测试及优化点一:mysql 配置参数对Mysql插入性能的影响
一般情况下,在MybatisPlus中使用saveBatch方法进行批量保存需要:在数据库连接串中添加&rewriteBatchedStatements=true,并保证MySQL驱动在5.0.18以上。
首先测试下savebatch方法不带有rewriteBatchedStatements 的情况
savebatch方法带有rewriteBatchedStatements 的情况
(第一次新增时间明显长于其它次的原因是因为第一次程序需要建立mysql connection链接,所以我们每次把第一次的取值忽略掉)
我们可以看到增加rewriteBatchedStatements =true 参数 对 saveBatch 方法的效率有着巨大的提升!阅读源码可得在ClientPreparedStatement executeBatchInternal()方法中存在rewriteBatchedStatements参数判断,如果没有rewriteBatchedStatements 参数,则PreparedStatement方法不执行批量操作的逻辑。
所以,第一个优化建议:
在使用mybatis-plus saveBatch 方法的时候需要添加jdbc参数rewriteBatchedStatements =true,并保证MySQL驱动在5.0.18以上
参考文献:MybatisPlus批量保存原理及失效原因排查_八球的博客-CSDN博客_mybatisplus savebatch原理
(标注: 接下来的saveBatch 方法测试都是带rewriteBatchedStatements =true参数的)
测试及优化点二:HikariCP数据库连接池的使用与参数优化
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatisPlusTest?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
## 此属性控制从池返回的连接的默认自动提交行为,默认值:true
auto-commit: true
## 数据库连接超时时间,默认30秒,即30000
co