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中下一篇:
用C语言简单的实现扫雷