Batch insert entities to DB (Quarkus, Hibernate)(将实体批量插入数据库(Quarkus、Hibernate))
问题描述
首先:我不习惯Quarkus或Hibernate(我几乎都是.Net)
问题:
我的服务收到一个大约10K的列表(我猜这是最常见的数字)。 这是通过资源终结点完成的,它需要+10秒才能完成,远远超过10秒。并且服务没有响应。
*Endpoint -> Service/Business -> DAO*
@Override
public void create(FooBusiness foo) {
var statuses = new ArrayList<StatusDto>();
for(var i = 1; i < foo.getFromList().size(); i++){
var bar = foo.getFromList().get(i);
statuses.add(new StatusDto(bar.x, bar.y));
}
statusDao.create(statuses);
}
statusDao.Create()用@Transactional
注释:
DAO为@ApplicationScoped
此EM为:
@PersistenceContext
EntityManager entityManager;
statusDao.Create():
@Transactional
public List<StatusDto> create(List<StatusDto> dto) {
for(var i = 0; i < dto.size(); i++){
var status = dto.get(i);
status.setCreatedTimestamp(LocalDateTime.now());
entityManager.persist(status);
}
entityManager.flush();
return dto;
}
我已经阅读了很多关于这方面的帖子,其中很多都建议使用此属性,并将Persistent循环拆分为与批处理大小相同: quarkus.hibernate-orm.jdbc.statement-batch-size
问题是,当我将它添加到应用程序中时,我得到了这个涂色:
无法解析配置项‘Statement-Batch-Size’
我花了几乎一天的时间试图找到如何加快速度的解决方案,这里有什么明显的遗漏吗?
和/或:
我是否可以将从service
到dao
的调用包装在某种魔法火中,并忘记Quarkus或Vert.x中内置的调用?
推荐答案
Hibernate将您持久化的所有实体保留在持久化上下文中,因此您将获得越来越多的内存,这可能会导致较差的性能。如果您不再像看起来那样需要这些实体,您可以分批刷新和清除它们,例如50个项目。
for (var i = 0; i < dto.size();) {
var status = dto.get(i);
status.setCreatedTimestamp(LocalDateTime.now());
entityManager.persist(status);
i++;
if ((i % 50) == 0) {
entityManager.flush();
entityManager.clear();
}
}
entityManager.flush();
这篇关于将实体批量插入数据库(Quarkus、Hibernate)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!