主要观点总结
文章主要讨论了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`
………………………………