【问题标题】:How to do bulk inserts with JpaRepository with dynamic batch_size i.e batch_size is not known如何使用 JpaRepository 使用动态 batch_size 进行批量插入,即 batch_size 未知
【发布时间】:2019-04-11 12:42:03
【问题描述】:

我正在使用 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 选项

【问题讨论】:

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


    【解决方案1】:

    您不能仅在运行时使用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();
        }
    }
    

    更新

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

    【讨论】:

    • 感谢您的回答。我正在使用 SessionCreationPolicy.STATELESS。我还能使用 session.save 或 session.flush/clear。
    • 如果你 repos exptend JpaRepository 然后你会调用.. repo.flush()
    • 好的,我明白了。是的,我必须使用 repo.save / repo.flush。因为我从 JpaRepository 扩展了我的存储库。所以没有动态选项。目前最大尺寸可能在 1000 左右,未来可能会增加。
    • 检查更新。但请注意不要过度使用展开功能。
    • 使用 for 循环或使用 Max batch_size 的 saveAll 可以提高性能。
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2019-11-12
    • 2018-06-10
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多