MyBatis 批量插入乱用 foreach 出现的问题

最近项目在运行过程中监控到了某个任务执行CPU占用过高,经过排查发现是一个定时批量新增数据的方法,主要消耗是由mybaits往数据库中新增数据造成的,XML中sql如下

发现这个问题后,在网上也是看到不少人都遇到了这个问题,通过在网上看到的,在这里自己也做下总结,避免再遇到类似的问题;

先说一下mybatis中<foreach>标签的作用,如下图,使用foreach进行批量插入,原理上就是让多条insert into插入语句变成了一条插入语句,针对部分情况可以带来性能上的提升,但同时也会带来两个问题;

问题一:当插入的数据较多时,相当于拼接的sql语句会特别的长,甚至超过sql语句的长度,一旦超出,就会抛出异常导致无法插入。

问题二:当插入的数据较多时,也比较耗时,针对这点官方也做了说明。

如此可见我们的问题就是第二个,插入的数量较多,sql执行缓慢,同时也无法保证我们不会出现问题一;

大家可以使用foreach配合分片批量插入。

这个方法可以理解为将10000条数据拆成每5000条去做foreach执行sql,10000条就是执行两次。

重点来了。上面讲的是,如果非要用<foreach>的方式来插入,可以提升性能的方式。而实际上,MyBatis文档中写批量插入的时候,是推荐使用另外一种方法。(可以看 中 Batch Insert Support 标题里的内容)

我们在项目当中因为使用的mybatis-plus,所以直接将该语句改为使用mybatis-plus的saveBatch()方法.

mybatis-plus的saveBatch方法和foreach标签批量新增对比:(写的非常细,自认做不到)

最近项目在运行过程中监控到了某个任务执行CPU占用过高,经过排查发现是一个定时批量新增数据的方法,主要消耗是由mybaits往数据库中新增数据造成的,XML中sql如下 发现这个问题后,在网上也是看到不少人都遇到了这个问题,通过在网上看到的,在这里自己也做下总结,避免再遇到类似的问题; 先说一下mybatis中 标签的作用,如下图,使用foreach进行批量插入,原理上就是让多条insert into插入语句变成了一条插入语句,针对部分情况可以带来性能上的提升,但同时也会带来两个问题; 问题一:当插入的数据较多时,相当于拼接的sql语句会特别的长,甚至超过sql语句的长度,一旦超出,就会抛出异常导致无法插入。 问题二:当插入的数据较多时,也比较耗时,针对这点官方也做了说明。 如此可见我们的问题就是第二个,插入的数量较多,sql执行缓慢,同时也无法保证我们不会出现问题一; 大家可以使用foreach配合分片批量插入。 这个方法可以理解为将10000条数据拆成每5000条去做foreach执行sql,10000条就是执行两次。 重点来了。上面讲的是,如果非要用 的方式来插入,可以提升性能的方式。而实际上,MyBatis文档中写批量插入的时候,是推荐使用另外一种方法。(可以看 中 Batch Insert Support 标题里的内容) 我们在项目当中因为使用的mybatis-plus,所以直接将该语句改为使用mybatis-plus的saveBatch()方法. mybatis-plus的saveBatch方法和foreach标签批量新增对比:(写的非常细,自认做不到)
经验分享 程序员 微信小程序 职场和发展