SpringBootData SaveAll批量插入慢解决办法

本文介绍了一种解决在服务器环境下使用saveAll批量插入数据速度慢的方法,通过使用JdbcTemplate和设置rewriteBatchedStatements参数,实现了高效的数据批量插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做项目的时候,需要批量插入数据。然后使用saveAll()在本地跑速度还好,打包在服务器上跑的时候发现执行saveAll()时sql在控制台一条一条打印,速度超级慢。后面使用JdbcTemplate,解决了这个问题,在次记录。

    @Autowired
    private JdbcTemplate jdbcTemplate;

使用autowired注入jdbcTemplate。

  @Override
    public void batchInsertUsers(List<Student> list) {
        String sql = "insert into tbl_student(name, age, class) values(?, ?, ?)";
        jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                String name= list.get(i).getName();
                int age = list.get(i).getAge();
                String class= list.get(i).getClass();
                ps.setString(1, name);
                ps.setInteger(2, age);
                ps.setString(3, class);
            }

            public int getBatchSize() {
                return list.size();
            }
        });
    }

只需要把sql和实体改成自己的就行了。

最重要的一点,在application.properties的连接数据库Url加上rewriteBatchedStatements=true。只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL

spring.datasource.url=jdbc:mysql://localhost:3306/audit_declaration?characterEncoding=utf8&useSSL=true&serverTimezone=UTC&verifyServerCertificate=false&rewriteBatchedStatements=true

 

Spring Data JPA 在进行大批量插入操作时可能会遇到性能瓶颈,特别是在数据库表结构设计、网络延迟或并发控制方面。以下是几个可能的解决方案: 1. **分批提交**:避免一次性将大量数据发送到数据库,可以使用 `JpaRepository` 的 `saveAll()` 或手动事务处理,每次保存一部分数据。 ```java List<MyEntity> entities = ...; int batchSize = 50; // 可能需要调整这个值 for (int i = 0; i < entities.size(); i += batchSize) { repository.save(entities.subList(i, i + batchSize)); } ``` 2. **优化数据库索引**:确保插入字段上有合适的索引,加快插入速度。如果经常对插入数据做查询,则考虑将主键字段作为唯一索引。 3. **使用存储过程或批处理**:如果数据库支持,可以创建存储过程或SQL批处理语句来进行高效的大规模插入。 4. **减少网络延迟**:检查网络连接是否稳定,如果有代理服务器或者防火墙限制,尝试优化它们。 5. **并发控制**:考虑使用乐观锁(如 @Version 注解)或悲观锁(通过 LockMode 进行控制)来避免并发冲突,降低更新次数。 6. **JPA 配置优化**:检查 `hibernate.hbm2ddl.auto` 设置,将其设置为 "update" 或者 "validate",以便在生产环境中避免因DDL操作导致的性能影响。 7. **使用延迟加载**:如果数据量大且不需要立即返回,可以考虑只加载必要的部分,减少一次性传输的数据量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值