首页/新闻资讯/正文详情

Mybatis批量插入性能优化与实现方式对比

发布时间:2026/11/10 8:58:23 来源:云帆数科 栏目:资讯中心
Mybatis批量插入性能优化与实现方式对比
1. Mybatis批量插入的四种实现方式对比在数据量较大的业务场景中单条插入的效率往往难以满足性能需求。以60万条数据测试为例循环单条插入耗时约1272秒而批量插入仅需28秒性能差距高达45倍。这种量级差异在真实生产环境中会更加明显因此掌握Mybatis的批量插入技术对开发者而言至关重要。1.1 循环单条插入的致命缺陷最直观的实现方式是遍历集合循环调用单条插入public void insert(ListUser userList) { userList.forEach(user - userDao.insert(user)); }对应的Mapper XML配置insert idinsert INSERT INTO user (username, address, remark, age, create_time) VALUES (#{user.username}, #{user.address}, #{user.remark}, #{user.age}, now()) /insert这种方式的性能瓶颈主要体现在三个方面每次插入都需要建立新的数据库连接除非使用连接池每条SQL语句都需要单独编译和执行频繁的IO操作导致网络延迟累积实际测试中插入60万条数据耗时约21分钟这在生产环境是完全不可接受的。但它的优势在于实现简单适合数据量极小100条或对性能不敏感的场景。1.2 动态SQL批量插入方案Mybatis的foreach标签可以实现真正的批量SQLpublic void insertBatch(ListUser userList) { // 每100条为一组分批处理 ListListUser partition ListUtil.partition(userList, 100); partition.forEach(users - userDao.insertBatch(users)); }Mapper配置关键点insert idinsertBatch INSERT INTO user (username, address, remark, age, create_time) VALUES foreach collectionusers itemuser separator, (#{user.username}, #{user.address}, #{user.remark}, #{user.age}, now()) /foreach /insert这里有几个实践经验值得注意批量大小建议设置在50-200之间过大可能导致SQL过长被数据库拒绝MySQL的max_allowed_packet参数需要相应调整默认4MB字段建议显式指定jdbcType避免类型推断错误测试显示60万条数据插入仅需28秒但要注意这种方案会生成超长SQL可能引发内存问题。2. 基于BatchExecutor的批处理模式2.1 Mybatis执行器原理剖析Mybatis内置三种执行器SimpleExecutor默认模式每执行完就关闭StatementReuseExecutor复用预处理语句减少编译开销BatchExecutor批量模式延迟执行直到显式提交启用BatchExecutor的典型配置SqlSession sqlSession sqlSessionFactory.openSession(ExecutorType.BATCH); try { UserDao mapper sqlSession.getMapper(UserDao.class); for (User user : userList) { mapper.insert(user); // 这里只是addBatch不会立即执行 } sqlSession.commit(); // 真正触发executeBatch } finally { sqlSession.close(); }2.2 性能对比与适用场景测试数据显示BatchExecutor模式耗时28.1秒与动态SQL方案相当。但两者有本质区别特性动态SQLBatchExecutorSQL生成方式拼接超长SQL参数化批处理内存占用高低数据库兼容性依赖数据库批量语法支持通用性更好事务控制单语句事务可跨多语句批量提交预处理语句复用无有提示Oracle数据库对超长SQL有严格限制约4000字符此时BatchExecutor是更安全的选择3. 原生JDBC批处理实现3.1 底层API的直接调用当需要极致性能时可以绕过Mybatis直接使用JDBCpublic void insertJdbc(ListUser userList) throws SQLException { Connection conn dataSource.getConnection(); conn.setAutoCommit(false); // 关键步骤1关闭自动提交 PreparedStatement ps conn.prepareStatement( INSERT INTO user (username, address, remark, age, create_time) VALUES (?,?,?,?,now())); for (User user : userList) { ps.setString(1, user.getUsername()); ps.setString(2, user.getAddress()); ps.setString(3, user.getRemark()); ps.setInt(4, user.getAge()); ps.addBatch(); // 关键步骤2加入批处理 if(i % 1000 0) { ps.executeBatch(); // 关键步骤3分段提交 conn.commit(); } } ps.executeBatch(); conn.commit(); // 关键步骤4最终提交 }3.2 性能优化关键点批处理大小每1000-5000条执行一次executeBatch()事务控制批量提交而非单条提交连接池配置使用高性能连接池如HikariCP重试机制对批量失败实现分段重试测试结果显示JDBC方案仅需16秒比Mybatis方案快42%。但这种优化需要以代码复杂度为代价。4. 生产环境实战建议4.1 批量插入的通用优化策略连接池配置# Spring Boot配置示例 spring: datasource: hikari: maximum-pool-size: 20 connection-timeout: 30000 max-lifetime: 1800000MySQL服务端优化-- 增大允许的数据包大小 SET GLOBAL max_allowed_packet1073741824; -- 关闭binlog可提升批量插入速度主从复制环境慎用 SET sql_log_bin 0;批处理大小经验值MySQL500-1000条/批Oracle100-200条/批PostgreSQL1000-2000条/批4.2 异常处理与事务回滚批量操作必须考虑失败场景try { // 批量操作逻辑 } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 记录失败位置实现断点续传 log.error(Batch failed at index {}, currentIndex, e); throw new BatchOperationException(批量操作失败, e); }4.3 新型ORM框架的替代方案对于新项目可以考虑MyBatis-Plus的saveBatch方法userService.saveBatch(userList, 1000); // 每1000条提交一次Spring Data JPA的批量支持Transactional public void batchInsert(ListUser users) { userRepository.saveAll(users); }JOOQ的批量操作APIdsl.batchInsert(users).execute();这些方案底层仍基于JDBC批处理但提供了更简洁的API。实际选择时需要权衡团队熟悉度和框架特性。

相关推荐

Kubernetes与vLLM:AI大模型推理的云原生实践
Kubernetes与vLLM:AI大模型推理的云原生实践

1. 项目概述:KCD Beijing vLLM 2026技术大会 KCD Beijing与vLLM 2026联合技术大会正在公开征集议题,这是一场聚焦Kubernetes与AI大模型推理深度融合的社区技术盛会。当Kubernetes已成为AI基础设施的事实标准,当大模型推理进入工程化与规模化… · 2026/11/2 17:11:50

KiCad Gerber导出详解:各层作用、参数设置与打样避坑
KiCad Gerber导出详解:各层作用、参数设置与打样避坑

先说个实打实的翻车现场:一块双层小板的Gerber打包发给板厂,第二天对方回消息问我“你顶层铜箔是不是画反了”。我打开压缩包一看,.GTL和.GBL两个文件被我按字母顺序排进了不同目录,备注里还写反了顶层底层。板子最后是救回来了&a… · 2026/11/10 8:58:23

AI安全本质是工程问题:智能体技术栈分层安全实践指南
AI安全本质是工程问题:智能体技术栈分层安全实践指南

1. 为什么说 AI 安全本质上是个工程问题 1.1 从“模型对齐”到“系统可靠性”的认知转变 很多人一聊到 AI 安全,第一反应就是模型对齐、提示词注入防御、输出内容过滤这些偏算法和策略层面的东西。我在过去一年参与过几个智能体项目的落地,踩过不少坑之… · 2026/11/3 2:01:39

梧州考低压电工证怎么避坑?郑州报考避坑指南帮你搞定
梧州考低压电工证怎么避坑?郑州报考避坑指南帮你搞定

梧州考低压电工证怎么避坑?郑州报考避坑指南帮你搞定 怕考不过白交培训费?别慌,这篇文章帮你理清流程、避开培训机构套路,还告诉你怎么一次通过低压电工证考试!… · 2026/11/10 8:58:10

石嘴山惠农办理电工证怎么网上查询靠谱机构
石嘴山惠农办理电工证怎么网上查询靠谱机构

石嘴山惠农办理电工证怎么网上查询靠谱机构 怕考不过白交培训费?石嘴山惠农办理电工证的小伙伴,别急,看完这篇就懂怎么避坑了。现在市面上培训机构鱼龙混杂,很多人花钱去培训,结果一考试就挂,钱花了不说,还耽误时间和精力。关键是你得知道,… · 2026/11/10 8:58:10

怎样查电工证有没有效继续教育学时要求
怎样查电工证有没有效继续教育学时要求

电工证怕考不过白交培训费?考前押题全攻略来了 怕考不过白交培训费,尤其是像你这样的濮阳在职建筑工人,花了几千块报的电工证培训班,要是最后没考过,那真是血亏。我这行干了十几年,见过太多人因为没掌握好考前押题,或者对怎样查电工证有没有效一无所知… · 2026/11/10 8:58:10

东丽高低压电工证复审延期怎么办理 郑州报考避坑指南
东丽高低压电工证复审延期怎么办理 郑州报考避坑指南

东丽高低压电工证复审延期怎么办理 郑州报考避坑指南 证书过期了不知道怎么复审延期,这是很多从事特种作业的人员在面对【东丽高低压电工证】时常常遇到的难题。很多人误以为证书过期了就只能重新考,其实不然,只要按照正确的流程操作,完全可以完成复审延… · 2026/11/10 8:58:10

沈阳考高压电工证培训内部消息:想进工地必须拿下这个证
沈阳考高压电工证培训内部消息:想进工地必须拿下这个证

沈阳考高压电工证培训内部消息:想进工地必须拿下这个证 你是不是也像我一样,刚从学校出来,手里啥证也没有,找工作处处碰壁?特别是想找电工相关的工作, 高压电工证 几乎是 准入门槛 。别急,今天我就来给你讲讲沈阳考高压电工证培训的 内部消息… · 2026/11/10 8:58:10

特种工满6年后值不值得考 你真的了解这证的含金量吗
特种工满6年后值不值得考 你真的了解这证的含金量吗

特种工满6年后值不值得考 你真的了解这证的含金量吗 工地太忙根本没时间复习考试,这几乎是每个特种作业人员都遇到的难题。特别是你已经干了6年特种工,现在考虑要不要继续考证,或者是否值得花时间去复习考试,心里肯定打鼓。别急,咱们今天就聊聊… · 2026/11/10 8:57:09

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/10 2:16:10

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/9 3:11:26

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/9 5:24:17

丹寨电工证怎么考?内部消息透露报考条件和流程
丹寨电工证怎么考?内部消息透露报考条件和流程

丹寨电工证怎么考?内部消息透露报考条件和流程 急需特种作业证才能上岗找工作,这是很多电工朋友最真实的焦虑。尤其是像丹寨电工证这样的证书,直接影响你的职业发展和薪资待遇。但你知道吗?很多人都在报考过程中踩坑,有的甚至花了几千块最后白忙一场。今… · 2026/11/10 0:00:13

成都建筑电工证办理郑州报考避坑指南
成都建筑电工证办理郑州报考避坑指南

成都建筑电工证办理郑州报考避坑指南 证书过期了不知道怎么复审延期?别慌!这篇文章手把手带你解决成都建筑电工证办理的难题,顺便避掉郑州报考的那些坑。不管你是刚拿到证的新手,还是准备复审的老电工,这波干货都别错过。… · 2026/11/10 0:00:13

梅州低压电工证怎么考?怕被中介坑?手把手教你全国通用流程
梅州低压电工证怎么考?怕被中介坑?手把手教你全国通用流程

梅州低压电工证怎么考?怕被中介坑?手把手教你全国通用流程 你是不是正为梅州低压电工证发愁?不知道去哪报名,怕被中介骗钱,又担心证书是不是全国通用?其实,这些顾虑都是正常人会有的。今天我就从一个在开封房建工程一线干了几年的电工角度,手把手教你… · 2026/11/10 0:00:13

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:35

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:58

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:25:08

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码