解决Mybatis-Plus批量插入数据太慢,堪称神速
前言
用过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这个参数后的执行速度比较
普通saveBatch
普通的saveBatch():从底层源码来讲其实也是一个一个循环插入的
public boolean saveBatch(Collection<T> entityList, int batchSize) {
String sqlStatement = this.sqlStatement(SqlMethod.INSERT_ONE);
int size = entityList.size();
this.executeBatch((sqlSession) -> {
int i = 1;
for(Iterator var6 = entityList.iterator(); var6.hasNext(); ++i) {
T entity = var6.next();
sqlSession.insert(sqlStatement, entity);
if (i % batchSize == 0 || i == size) {
sqlSession.flushStatements();
}
}
});
return true;
}
在数据库的连接加上rewriteBatchedStatements=true的属性
jdbc:mysql://rm-bp1k3mk95rn1c17ammo.mysql.rds.aliyuncs.com:3306/wmmall?useSSL=false&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true