java - 如何使用动态batch_size(即batch_size未知)的JpaRepository进行批量插入

标签 java spring-boot hibernate jpa spring-data-jpa

我正在使用 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 API 选项来动态更改 batch_size,但您可以进行某种控制:

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();
    }
}

更新

有一个可能的解决方法,但您需要创建一个自定义存储库,以便能够注入(inject) 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);
    }
}

关于java - 如何使用动态batch_size(即batch_size未知)的JpaRepository进行批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55632799/

相关文章:

java - Hibernate 给我无效的更新 sql 查询

java - 如何在不使用 persistence.xml 的情况下在 Wildfly 中部署时设置 hibernate.hbm2ddl.auto

java - Spring Boot Jackson 日期格式

spring - Gradle任务将Spring Boot项目打包到耳朵

mysql - 运行 spring boot jar 文件时出错(创建名称为 'dataSource' 的 bean 时出错)

Java Hibernate HQL无法指定目标表

java - 如何让我的弹跳球移动?

java - 用于输出棋盘格的按钮的 GridLayout

java - 如何从 Eclipse 网络设置访问动态代理?

java - Java 中的 SQL 构建器