将实体批量插入数据库(Quarkus、Hibernate) [英] Batch insert entities to DB (Quarkus, Hibernate)

查看:0
本文介绍了将实体批量插入数据库(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’

我花了几乎一天的时间试图找到如何加快速度的解决方案,这里有什么明显的遗漏吗?

和/或:

我是否可以将从servicedao的调用包装在某种魔法火中,并忘记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)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆