[英]Can I use Spring Data saveAll() method and Hibernate 5 batch?
我有一个带有application.yml
的Spring Boot应用application.yml
:
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: *my_url*
password: *my_pass*
username: *my_username*
jpa:
properties:
hibernate:
jdbc:
batch_size: 15
#order_inserts: true
#order_updates: true
#batch_versioned_data: true
当我尝试使用方法saveAll(Iterable<S> entities)
保存20万个实体时,它同时保存了所有20万个实体,但是我想一次保存15个实体的批次。
是否可以使用Spring Data的SimpleJpaRepository
和Hibernate的批处理?
我的方法
@Service
public class BulkService {
@PersistenceContext
private EntityManager em;
// @Value("${spring.jpa.properties.hibernate.jdbc.batch_size}")
private int batchSize = 20;
private List<Entity> savedEntities;
public Collection<Entity> bulkSave(List<Entity> entities) {
int size = entities.size();
savedEntities = new ArrayList<>(size);
try {
for (int i = 0; i < size; i += batchSize) {
int toIndex = i + (((i + batchSize) < size) ? batchSize : size - i);
processBatch(entities.subList(i, toIndex));
em.flush();
em.clear();
}
} catch (Exception ignored) {
// or do something...
}
return savedEntities;
}
@Transactional
protected void processBatch(List<Entity> batch) {
for (Entity t : batch) {
Entity result;
if (t.getId() == null) {
em.persist(t);
result = t;
} else {
result = em.merge(t);
}
savedEntities.add(result);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.