首页 > 解决方案 > 如何使用 JpaRepository 使用动态 batch_size 进行批量插入,即 batch_size 未知

问题描述

我正在使用 java spring boot API,我需要在我的数据库中插入大量数据。我知道我怎么能做到这一点。

要使用 Sring Boot 和 Spring Data JPA 进行批量插入,您只需要两件事:

我想知道的是如何实现动态批处理大小,即在某些类中,我只需要保存/插入 5 到 10 条记录,而在某些类中,这个数字可能是 200 到 500 条或更多记录。

现在,我怎样才能实现这个动态 batch_size 选项

标签: javaspring-boothibernatejpaspring-data-jpa

解决方案


您不能在运行时batch_size仅通过使用EntityManagerAP Ioption 来动态更改它,但您可以进行某种控制:

1)将batch_size设置为最高期望值(即500)

2)设置这些道具是为了让hibernate不要尝试使用之前完成的save/update语句。

hibernate.order_inserts=true
hibernate.order_updatest=true

3)使用save代替saveAll。循环遍历您的列表并刷新与正在保存的类相关的每次次数:

int = flushAfterThisNumber = 10;

for ( int i=0; i<entities.length; i++ ) {
    session.save(entities[i]);
    if ( i % flushAfterThisNumber == 0 ) { 
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

更新

EntityManager有一种可能的解决方法,但您需要创建一个自定义存储库,以便您能够注入Session一个batch_size.

public class CustomerRepositoryImpl implements CustomCustomerRepository {

    @PersistenceContext
    private EntityManager em;

    @Override
    public void saveAllInBatch(List<Ent> entities, int batchSize) {
        Session session = em.unwrap(Session.class);
        session.setJdbcBatchSize(batchSize);

        em.saveAll(entities);
    }
}

推荐阅读