Spring Boot 3 新特性:轻松实现万级数据的高效批量插入

科技   2024-10-14 11:28   河北  


前言

随着Spring Boot 3的推出,开发者们迎来了诸多激动人心的新特性和改进。其中,针对批量数据插入的性能优化尤为突出。在数据密集型的应用场景中,实现高效的批量数据插入至关重要。本文将深入介绍Spring Boot 3中几种主流的批量插入方法,并通过具体的代码示例来展示如何实现万级数据的高效批量插入。

一、使用JDBC批处理

Spring Boot在集成了JDBC之后,允许开发者利用JdbcTemplate的batchUpdate功能来实现批量数据插入。这一方法在处理大规模数据插入时表现得尤为出色。

import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
  
import java.util.List;
  
@Repository  
public class DataRepository {
    @Autowired  
    private JdbcTemplate jdbcTemplate;
  
    public void batchInsert(List<User> users) {
        StringBuilder sql = new StringBuilder("INSERT INTO users (name, age) VALUES (?, ?)");
        jdbcTemplate.batchUpdate(sql.toString(), users, users.size(), (ps, user) -> {
            ps.setString(1, user.getName());
            ps.setInt(2, user.getAge());
        });
        System.out.println("Batch insert completed!");
    }
}
  
class User {
    private String name;
    private int age;
    // Getters and Setters }

二、使用MyBatis批量插入

MyBatis也提供了强大的批量插入功能。可以在Mapper文件中定义批量插入的SQL语句,然后在Mapper接口中定义对应的方法。

Mapper XML文件

<mapper namespace="com.example.mapper.UserMapper"> 
    <insert id="batchInsert" parameterType="java.util.List">
        INSERT INTO users (name, age) VALUES
        <foreach collection
="list" item="item" separator=",">
            (#{item.name}, #{item.age})
        </foreach>
    </insert>
</mapper>

Mapper接口

public interface UserMapper { 
    void batchInsert(List<User> users);
}

Service层调用

@Service  
public class UserService {
    @Autowired  
    private UserMapper userMapper;
  
    public void batchInsert(List<User> users) {
        userMapper.batchInsert(users);
    }
}

三、使用Spring Batch

对于需要处理非常大的数据集,Spring Batch提供了一个强大且灵活的框架。它允许你定义Job、Step,以及ItemReader、ItemProcessor和ItemWriter来处理批量数据处理任务

@Configuration  
@EnableBatchProcessing  
public class BatchConfig {
    @Autowired  
    private JobBuilderFactory jobBuilderFactory;
    @Autowired  
    private StepBuilderFactory stepBuilderFactory;
  
    @Bean  
    public ItemReader<User> userItemReader() {
        return new FlatFileItemReaderBuilder<User>()
                .name("userItemReader")
                .resource(new ClassPathResource("users.csv"))
                .delimited()
                .names("name", "age")
                .targetType(User.class)
                .build();
    }
  
    @Bean  
    public ItemProcessor<User, User> userItemProcessor() {
        return new ItemProcessor<User, User>() {
            @Override  
            public User process(User item) throws Exception {
                // 数据处理逻辑
                return item;
            }
        };
    }
  
    @Bean  
    public ItemWriter<User> userItemWriter(JdbcBatchItemWriter<User> writer) {
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        writer.setSql("INSERT INTO users (name, age) VALUES (:name, :age)");
        return writer;
    }
  
    @Bean  
    public Step importUserStep(JdbcBatchItemWriter<User> writer) {
        return stepBuilderFactory.get("importUserStep")
                .<User, User>chunk(1000)
                .reader(userItemReader())
                .processor(userItemProcessor())
                .writer(writer)
                .build();
    }
  
    @Bean  
    public Job importUserDataJob(Step importUserStep) {
        return jobBuilderFactory.get("importUserDataJob")
                .start(importUserStep)
                .build();
    }
}

 配置和优化

为了确保批量插入的高效性,还需要进行一些配置和优化。例如,在application.yml中配置数据库连接时,可以开启MySQL的批处理模式:

spring: 
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/bjpowernode?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    username: root
    password: xxx
    driver-class-name: com.mysql.cj.jdbc.Driver
此外,当使用MyBatis进行批量插入时,如果数据量非常大(超过200条),建议使用BATCH方式插入,并适当设置commit的间隔,以提高性能。

总结

Spring Boot 3提供了多种手段来实现万级数据的高效批量插入。通过使用JDBC批处理、MyBatis批量插入、Spring Batch等方法,可以显著提高数据插入的性能。同时,合理的配置和优化也是确保批量插入高效性的关键。希望本文能够帮助你在Spring Boot 3项目中轻松实现万级数据的高效批量插入。




Java技术前沿
专注分享Java技术,包括但不限于 SpringBoot,SpringCloud,Docker,消息中间件等。
 最新文章