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
),因为持久上下文不是线程安全的。
如何对数据库进行异步调用并保存详细信息并取回响应实体?假设我访问了两个不同的数据中心。我怎样才能取回实体作为响应?
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
),因为持久上下文不是线程安全的。