代码改变世界

Mybatis-plus的savebatch伪批量剖析

2022-06-03 17:17  话猫  阅读(11006)  评论(1编辑  收藏  举报

一、源码

今天工作听同事说mybatis-plus的saveBatch方法是伪批量,底层实现是一个一个插入。用了这么久的saveBatch方法,竟然.....

不追根溯源不是我小糖的风格哇,赶紧扒一波源码分析一哈

mybatis-plus的saveBatch方法是ServiceImpl类实现的,源码如下:

 

 

定睛一看果然有一个for循环在处理传递的集合实体,依次插入数据库 batchSqlSession.insert(sqlStatement, anEntityList)

二、执行流程

看完了源码准备实验一波,看下执行的sql的日志

//lists中有2005 
this.saveBatch(lists);

mybtis-plus的日志

mysql的日志

自动提交改为0
然后多行insert语句
最后提交事务

由mysql的日志,可以得出结论,确实是一条一条插入数据库的,那这样插入效率可真是令人担忧。

三、优化

网上大部分都有说对于saveBatch的慢插入效率还是可以提升的,在数据库连接上做以下配置:

url: jdbc:mysql://127.0.0.1:3306/photo?rewriteBatchedStatements=true

在加完rewriteBatchedStatements=true参数之后,看下saveBatch的sql执行日志

 

mybatis-plus的日志还是跟上面一样

mysql的日志:

 

 

它是先将自动提交改为0
然后将1000条数据组成一批(一个insert语句)来执行
最后提交事务,autocommit改为1

好了,到这里分析完毕!!!!