上一篇
"小王啊,这个月用户注册量暴涨,每天新增10万+数据,现在系统插入速度跟蜗牛一样,用户投诉都堆成山了!" 技术总监老张拍着桌子说道。😫
作为开发的小王心里一紧——传统的单条插入方式在数据量暴增时确实力不从心,别担心!今天我们就来聊聊如何用Mybatis Plus的批量插入功能,让数据库写入速度飞起来!✈️
性能对比(以1万条数据为例):
优势明显:
确保你的项目已经引入Mybatis Plus依赖(2025年最新版本):
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.6.1</version> </dependency>
// 1. 获取Mapper实例 UserMapper userMapper = ...; // 2. 准备批量数据 List<User> userList = new ArrayList<>(); for (int i = 0; i < 10000; i++) { userList.add(new User("user_" + i, i % 30)); } // 3. 使用saveBatch方法(默认分批,每批1000条) boolean isSuccess = userService.saveBatch(userList); // 4. 带批大小的重载方法 userService.saveBatch(userList, 2000); // 每批2000条
@Transactional public void batchInsertWithTransaction(List<User> users) { // 启用事务的批量插入 userService.saveBatch(users); // 其他业务操作... logService.saveBatch(logs); }
注意:批量操作建议放在事务中,但不宜过大(通常1万条左右为一个批次)
合理设置批次大小:
关闭自动提交:
mybatis-plus: global-config: db-config: logic-not-delete-value: 0 logic-delete-value: 1 configuration: default-executor-type: batch # 启用批量模式
JDBC参数调优:
spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5
使用多线程批量插入(数据量极大时):
// 使用并行流处理 Lists.partition(userList, 2000).parallelStream().forEach(batch -> { userService.saveBatch(batch); });
SQL长度限制:
内存溢出风险:
唯一键冲突:
// 使用on duplicate key update userService.saveOrUpdateBatch(userList);
批量插入不返回ID:
如果需要ID,考虑单条插入或特殊处理
数据量 | 方式 | 耗时 | 备注 |
---|---|---|---|
1万条 | 单条插入 | 58s | CPU占用高 |
1万条 | saveBatch | 8s | 默认分批 |
10万条 | 并行批量 | 2s | 5线程 |
100万条 | 分页批量 | 36s | 每批5000条 |
Mybatis Plus 3.6+版本新增:
// 智能批量插入(2025新API) userService.smartBatchSave(userList);
掌握了Mybatis Plus的批量插入技巧后,小王成功将系统插入性能提升了30倍!用户投诉瞬间清零,还获得了季度技术创新奖。🏆
批量插入虽好,但也要根据实际场景灵活运用,数据量小的时候,单条插入反而更简单直观,编程之道,在于平衡!☯️
下次当你面对海量数据需要入库时,不妨试试这些方法,让你的数据库"吃"数据像吃自助餐一样高效!🍽️💨
本文由 狄浩丽 于2025-07-30发表在【云服务器提供商】,文中图片由(狄浩丽)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/481682.html
发表评论