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)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:将实体批量插入数据库(Quarkus、Hibernate)


基础教程推荐
- 降序排序:Java Map 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01