CompletableFuture 进行多个数据库调用并取回响应

CompletableFuture to make multiple DB calls and get the response back

如何对数据库进行异步调用并保存详细信息并取回响应实体?假设我访问了两个不同的数据中心。我怎样才能取回实体作为响应?

CompletableFuture.supplyAsync(() -> abcDc1Repository.save(localEntity));
CompletableFuture.supplyAsync(() -> abcDc2Repository.save(localEntity));

您可以使用CompletableFuture.allOf()

    CompletableFuture<OrderEntity> firstFuture = CompletableFuture.supplyAsync(
            () -> firstRepository.save(firstEntity)
    );
    CompletableFuture<OrderEntity> secondFuture = CompletableFuture.supplyAsync(
            () -> secondRepository.save(secondEntity)
    );

    CompletableFuture.allOf(firstFuture, secondFuture).join();

    OrderEntity firstEntity = firstFuture.get();
    OrderEntity secondEntity = secondFuture.get();

如果您保存新实体,则不需要结果。 Hibernate 会将 id 设置为传递的实体。

来自SimpleJpaRepository

    @Transactional
    @Override
    public <S extends T> S save(S entity) {
        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }

备注

请记住,CompletableFuture.supplyAsync() 使用通用的 fork-join 池。因此,您的操作将在应用程序的任何点等待 stream.parallel() 个操作。

此外,对于这两个调用,您不应该有一个公共事务(持久上下文,@Transactional),因为持久上下文不是线程安全的。