繁体   English   中英

如何使用 JpaRepository 使用动态 batch_size 进行批量插入,即 batch_size 未知

[英]How to do bulk inserts with JpaRepository with dynamic batch_size i.e batch_size is not known

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

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

  • 设置选项spring.jpa.properties.hibernate.jdbc.batch_size = 50
  • 将您的存储库的saveAll()方法与准备插入的实体列表一起使用。

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

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

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

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

2)设置这些 props 以使 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 ,然后解开 Hibernate 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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM