![](/img/trans.png)
[英]Hibernate: Why should I manually flush() even if I set batch_size in configuration file?
[英]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.