专栏名称: Java知音
专注于Java,推送技术文章,热门开源项目等。致力打造一个有实用,有情怀的Java技术公众号!
今天看啥  ›  专栏  ›  Java知音

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

Java知音  · 公众号  · 数据库  · 2024-11-23 10:40

主要观点总结

文章主要讨论了MyBatis中批量插入数据的问题,包括使用foreach循环批量插入时遇到的问题以及解决方案。

关键观点总结

关键观点1: MyBatis中批量插入数据的问题

文章首先介绍了项目中遇到的MyBatis批量插入数据的问题,主要消耗在往MyBatis中批量插入数据时。

关键观点2: 使用foreach循环进行批量插入

文章提到了使用MyBatis的foreach循环进行批量插入的方法,并解释了其原理和存在的问题。

关键观点3: 为何foreach循环会导致性能问题

文章详细解释了为何在MyBatis中使用含有大量values的foreach循环会导致性能问题,包括PreparedStatement的长度和参数映射的时间消耗。

关键观点4: 提升批量插入性能的方法

文章提供了两种提升批量插入性能的方法:1. 减少一条insert语句中的values个数;2. 使用ExecutorType.BATCH的插入方式。

关键观点5: 总结

文章最后总结了进行MyBatis批量插入时的最佳实践,包括推荐使用ExecutorType.BATCH的插入方式,以及如果非要使用foreach的方式,需要将每次插入的记录控制在20~50左右。


文章预览

近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。 mapper configuration 是用foreach循环做的,差不多是这样。 由于项目保密,以下代码均为自己手写的demo代码 < insert   id = "batchInsert"   parameterType = "java.util.List" >        insert into USER (id, name) values        < foreach   collection = "list"   item = "model"   index = "index"   separator = "," >             (#{model.id}, #{model.name})        foreach >    insert >    这个方法提升批量插入速度的原理是,将传统的: INSERT   INTO   `table1`  ( `field1` ,  `field2` )  VALUES  ( "data1" ,  "data2" );   INSERT   INTO   `table1`  ( `field1` ,  `field2` )  VALUES  ( "data1" ,  "data2" );   INSERT   INTO   `table1`  ( `field1` ,  `field2` )  VALUES  ( "data1" ,  "data2" );   INSERT   INTO   `table1`  ( `field1` ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览