[英]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.