大数跨境
0
0

性能相差60倍!Spring Boot 批量插入你做对了吗?5种方式对比

性能相差60倍!Spring Boot 批量插入你做对了吗?5种方式对比 Spring全家桶实战案例
2025-10-09
0
导读:性能相差60倍!Spring Boot 批量插入你做对了吗?5种方式对比
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!

🎉🎉《Spring Boot实战案例合集》目前已更新179个案例,我们将持续不断的更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

→ 现在就订阅合集

环境:SpringBoot3.4.2



1. 简介

批量操作是提升数据处理效率的关键手段。传统的逐条插入(如循环执行 INSERT)存在大量网络往返和事务开销,性能极低。为优化数据导入与写入性能,需采用批量插入技术,通过减少 SQL 解析、降低事务提交频率、充分利用数据库批处理机制等方式显著提升吞吐量。常见场景包括日志入库、数据迁移和批量导入等。

你写的代码看似批量插入,但若未正确配置 JDBC 参数等相关配置,那么SQL 语句仍会被逐条发送执行。看似“批量”,实则“单条循环”,实际没有任何的性能提升。

本文将基于 MySQL,探讨多种批量插入的优化策略,涵盖JPA、JDBC 批处理、多值 INSERT、LOAD DATA INFILE 等核心方法,并结合实际性能对比,帮助开发者选择最优方案,实现高效稳定的数据写入。如下图,最终性能对比:

2.实战案例

准备环境

引入JPA依赖

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

配置文件

spring:  datasource:    driverClassName: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/ddd    username: root    password: xxxooo    type: com.zaxxer.hikari.HikariDataSource---spring:  jpa:    properties:      hibernate:        '[format_sql]'false   

以上述内容作为初始环境,后续我们都将基于此配置来演示并调优每一种批量insert操作。

为了查看真实SQL执行情况,我们还需要确保MySQL开启了如下配置:

开启通过日志功能,这样任何DDL/DML/DCL等语句都会记录在该日志文件中。

准备操作类

@Entity@Table(name = "t_person")public class Person {  @Id  private Long id ;  private String name ;  private Integer age ;  private String email ;}public interface PersonRepository extends JpaRepository<PersonLong> {}// serviceprivate final PersonRepository personRepository ;@Transactionalpublic void batchSave(List<Person> list) {  // 具体实现方案}

准备单元测试类

@SpringBootTestpublic class PersonServiceTest {  @Resource  private PersonService ps;  private List<Person> datas = new ArrayList<>();  // 执行单元测试前执行数据生成,20w数据  @BeforeEach  public void init() {    for (long i = 1; i <= 200_000; i++) {      datas.add(new Person(i, "姓名 - " + i, new Random().nextInt(100), i + "@qq.com"));    }  }  @Test  public void testBatchSave() {    long start = System.currentTimeMillis();    this.ps.batchSave(datas);    System.err.println("耗时:" + (System.currentTimeMillis() - start));  }}

接下来,我们将基于此环境进行5种方式的批量操作测试。

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读285
粉丝0
内容832