MyBatis批量插入的3种方案对比,速度差10倍!

boyanx7个月前技术教程49

你还在用for循环做MyBatis批量插入? 本文通过真实案例+代码实测,对比三种批量插入方案的速度差异与实现原理。文末附实测数据截图,看完立省80%数据库操作时间!


一、青铜方案:循环单条插入(性能灾难)

// 典型错误示例
for (User user : userList) {
    userMapper.insert(user);
}

特点

  • 每条insert语句单独执行
  • 每次请求都经历完整JDBC流程
  • 事务自动提交(除非手动控制)

实测结果(1万条数据):

  • 耗时:约30秒
  • 优点:代码简单
  • 缺点:产生1万次网络IO,99%的时间浪费在连接开销

二、白银方案:BatchExecutor批处理(性能提升10倍)

// 开启批处理模式
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

for (User user : userList) {
    mapper.insert(user);
    if(i % 1000 == 0){
        sqlSession.flushStatements(); // 分段提交
    }
}
sqlSession.commit();

核心原理

  • 通过ExecutorType.BATCH启用JDBC批处理
  • 将多个SQL语句打包发送
  • 事务统一提交

实测结果(1万条数据):

  • 耗时:约3秒
  • 优点:JDBC层优化,网络IO减少90%
  • 缺点:需要手动控制提交时机

三、王者方案:动态SQL拼接(极限性能)

<!-- XML动态SQL -->
<insert id="batchInsert">
    INSERT INTO user (name,age) VALUES
    <foreach collection="list" item="item" separator=",">
        (#{item.name}, #{item.age})
    </foreach>
</insert>

执行特点

  • 生成单条INSERT INTO ... VALUES (...),(...)语句
  • 数据库单次解析执行
  • 利用数据库批量写入优化

实测结果(1万条数据):

  • 耗时:约1秒
  • 优点:理论最快执行方式
  • 致命缺陷:SQL长度限制(MySQL默认4MB)

全方位对比表

维度

循环单条插入

BatchExecutor

动态SQL拼接

执行方式

N条独立SQL

JDBC批处理

单条大SQL

网络IO次数

N次

1次

1次

事务控制

自动提交

手动提交

单事务

内存消耗

高(SQL缓存)

可读性

★★★★

★★★

★★

适用场景

<100条

1k-10w级

<5k条(防溢出)


实测数据验证(1万条记录)


避坑指南

  1. 动态SQL长度陷阱:MySQL的max_allowed_packet参数限制单条SQL大小
  2. 批处理内存溢出:每5千条左右建议执行flushStatements()
  3. 事务一致性:BatchExecutor必须显式commit才会生效
  4. 主键回写:动态SQL方案无法获取全部自增ID

选型建议

  • 小数据量(<500条):动态SQL方案最优
  • 常规批量(1k-5w条):BatchExecutor最稳妥
  • 超大数据量(>10w条):结合BatchExecutor+分段提交

终极技巧:生产环境推荐组合方案:BatchExecutor + 分批次提交 + 动态SQL长度控制,实测可提升百倍性能!


思考题:为什么动态SQL方案在Oracle数据库中反而可能变慢?欢迎评论区讨论!(提示:与SQL解析机制有关)

相关文章

有哪些PLC编程的低代码工具推荐

PLC编程低代码工具推荐及功能对比一、西门子 TIA Portal核心低代码特性支持“拖拽式组态”与可视化编程,简化硬件配置与逻辑设计流程。集成 Mendix 低代码平台,实现 IT/OT 融合,支持...

VBA信息获取与处理:如何在多个工作表中查找某个给定值

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息...

python编程错误“大侦探”:如何精准揪出代码中的小调皮

在编程的奇妙世界里,我们就像勇敢的探险家,有时也会遇到一些“小调皮”——编程错误。这些错误就像是隐藏在代码森林中的神秘陷阱,让我们一不小心就栽了跟头。那么,如何才能像聪明的侦探一样,精准地揪出这些错误...

超级AI工具DeepWiki:代码的交互式百科全书

「一夜之间GitHub所有项目的底裤都被扒了,Devin王炸更新! 」代码圈炸了! 那个曾让全网程序员瑟瑟发抖的Devin团队又放核弹——GitHub仓库现在能像维基百科一样被AI解剖得明明白白。把链...

用Python进行机器学习(13)-图像特征提取

相对于前面的机器学习都是处理一些简单的数字,今天我们来用机器学习处理一点稍微高级的内容,我们进行图像的特征提取。图像的特征提取有很多的用途,比如图像分类、目标检测、图像检索、聚类分析、异常检测、图像生...

Java隐藏的10倍效率技巧!90%程序员不知道的魔法方法(附代码)

导语:“同事1小时写完的代码,你用了1天?不是技术差距,是你不懂Java的隐藏魔法!今日头条首发7个颠覆认知的编码技巧,文末送《Java性能优化秘籍》!”一、灵魂暴击:用对工具代码量少一半问题场景:“...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。