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