MyBatis批量插入几千条数据,请慎用foreach

如题所述

项目中遇到的性能瓶颈在于使用 MyBatis 批量插入大量数据时,CPU 占用过高。经过排查,发现问题根源在于 mapper configuration 中使用了 foreach 循环进行批量插入,这个方法看似能够提升速度,原理是将多个小型操作合并为一次操作。在 MySQL 文档中,确实提到过优化插入速度的建议,即组合多个操作到一个大型操作中,这样可以一次性发送多行数据,将索引更新和一致性检查延迟到最后执行。

然而,实际应用中,当表的列数较多(超过 20)且一次性插入的行数达到 5000 以上时,这个方法的表现并不理想,耗时长达 14 分钟。资料中有一条关键提醒:当插入数量很多时,不能一次性全放在一条语句里。这一行为为什么会导致如此之慢呢?答案在于 foreach 后的大量 values 会导致生成的 SQL 语句特别长,包含大量占位符,这使得参数与占位符的映射过程变得极其耗时。更严重的是,MyBatis 的预处理语句缓存机制无法对这种动态生成的 SQL 语句进行有效缓存,因此每次执行都会重新解析 SQL 语句,这一过程耗时明显。

深入分析得知,MyBatis 的 foreach 语句并未实现真正的批量插入,它生成的 SQL 语句是一个单个且可能非常大的语句,这导致了后续的性能问题。正确的做法是将插入操作分解到 Java 的 foreach 循环中,通过 MyBatis 的 ExecutorType 设置为 Batch,多次执行插入语句。这种方式类似于 JDBC 的批处理机制,显著提高了性能,将原本耗时 14 分钟的操作缩短至不到 2 秒。

总结而言,尽管 foreach 的批量插入方法在理论上有一定优势,但在实际应用中,尤其是当插入数据量较大时,推荐使用 MyBatis 的 Batch 插入功能。如果使用 foreach,应控制每次插入的记录数量在 20~50 行左右,以避免性能瓶颈。通过这种方式,可以有效提升 MyBatis 批量插入数据的效率。
温馨提示:内容为网友见解,仅供参考
无其他回答

MyBatis批量插入几千条数据,请慎用foreach
总结而言,尽管 foreach 的批量插入方法在理论上有一定优势,但在实际应用中,尤其是当插入数据量较大时,推荐使用 MyBatis 的 Batch 插入功能。如果使用 foreach,应控制每次插入的记录数量在 20~50 行左右,以避免性能瓶颈。通过这种方式,可以有效提升 MyBatis 批量插入数据的效率。

求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了...
实际测试中,使用ExecutorType.BATCH插入方式后,性能得到了显著提升,可以将5000+条数据的插入操作在不到2秒内完成。因此,如果需要在MyBatis中进行批量插入,推荐使用ExecutorType.BATCH的插入方式,除非有特殊需求或限制,否则应避免使用foreach循环进行批量插入。在操作过程中,合理控制每次插入的记录数量,...

MyBatis 批量插入别再乱用 foreach 了,5000 条居然花了 14 分钟...
实际上,MyBatis文档建议使用Batch插入方式,通过设置session的executor type为Batch,多次执行插入语句,与JDBC的批量操作类似。实践表明,采用Batch插入后,性能显著提升,完成5000条插入只需2秒。综上,优化MyBatis批量插入性能的关键在于合理控制每条插入语句的values数量,并优先考虑Batch插入方法。这样可以有效...

MyBatis 批量插入使用 foreach 循环插入的优化,使用分片多线程_百度知 ...
在使用MyBatis进行大规模数据批量插入时,传统的foreach循环插入方式可能效率低下。首先,我们会在一张设计有多个字段的MySQL用户表上进行实验,比如插入50000条数据。常规的单条循环插入耗时长,耗尽CPU资源,耗时1634240毫秒,即约27分钟。对比之下,使用foreach批量插入虽然提升了速度,但存在SQL语句过长导致...

闻风丧胆的 foreach ,别再乱用了!
资料指出,当插入数据量大时,不应将所有行一次性放入一条语句,因为这会创建过长的PreparedStatement,增加映射占位符与参数的时间消耗。实际上,values的增长会导致解析时间成指数级增长。为提升性能,如果必须使用foreach,建议减小每次插入的行数,保持在20-50行以内,以达到最佳效率。不过,MyBatis官方...

MyBatis批量插入数据的3种方法!
随后,我们通过Spring Boot项目进行批量插入数据10W条的性能测试,测试结果显示,MyBatis Plus的批量插入性能较循环单次插入提升14.5倍。深入分析MyBatis Plus的源码,核心实现是saveBatch方法,该方法将数据分成N份,每1000条执行一次批量插入,显著提高了性能。原生批量插入方法通过MyBatis的foreach标签拼接...

MyBatis 批量插入数据的 3 种方法!
1. 循环单次插入:此方法耗时长,性能低,容易引起误解。2. MyBatis Plus 批量插入:通过 MP 框架实现,性能提升明显,代码结构清晰。3. 原生批量插入:借助 MyBatis 的 foreach 标签一次性执行 SQL,性能高,但易引发 SQL 大小限制问题。测试与分析:执行插入 10W 条数据,循环单次插入耗时 88574 ...

【Mybatis】功能强大的动态SQL之foreach批量查询、批量插入
在Mybatis中,foreach元素在处理批量操作时表现出强大的功能。它简化了处理动态数据集合的需求,无论是查询还是插入,都可以通过巧妙地使用foreach来实现。1. foreach实现批量查询在实际业务中,当需要查询多个id时,传统的or或in语法可能显得冗余。Mybatis的foreach可以动态地处理这种场景。例如,我们可以...

【Mybatis】功能强大的动态SQL之foreach批量查询、批量插入
动态SQL之foreach 在探讨Mybatis的动态SQL功能时,foreach成为了处理集合数据的有力工具。对于业务层传入的批量数据,如数组或集合,可以使用foreach元素高效地执行批量操作,如查询和插入。批量查询 先回顾SQL中的or与in操作符。在查询特定条件(如id为1、2或3的用户)时,使用or显得冗余,in则更加简洁...

mybatis 批量操作数据
mybatis的批量操作有两种方式,一是使用foreach标签,二是使用mybatis的BATCH模型 在xml中通过foreach对表数据进行循环操作 在oracle中不支持insert into product(name, type, price) values ('a', 'tv', 1233), ('b', 'ac', 3455),...('','','')这种形式的sql,因此oracle批量插入使用 in...

相似回答
大家正在搜