簡體   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