结合CompletableFuture和JdbcTamplate的正确方法是什么?

时间:2020-04-21 18:26:17

标签: java concurrency spring-jdbc completable-future

我正在尝试使用JdbcTemplate对数据库进行一些简单的查询。我的方法正确吗?

@Async
public CompletableFuture<List<ResultClass1> query1() {
  return CompletableFuture.completedFuture(jdbcTemplate.query("my sql",rowMap, paramter));  
}

@Async
public CompletableFuture<List<ResultClass2> query2() {
  return CompletableFuture.completedFuture(jdbcTemplate.query("my sql2",rowMap, paramter));  
}

CompletableFuture<List<ResultClass1> future1 = dao1.query1();
CompletableFuture<List<ResultClass2> future2 = dao2.query2();

CompletableFuture.allOf(future1, future2).join();

1 个答案:

答案 0 :(得分:0)

我想您已经掌握了,如果您要尝试同时运行这些查询,然后等待两个查询都完成。但是,您的应用程序将被阻止,直到两个操作都完成。为了避免这种情况,通常您可以执行以下操作:

CompletionStage<CombinedResult> combinedResult =
    CompletableFuture.allOf(future1, future2).thenApplyAsync(dummy -> {
  List<ResultClass1> query1Results = future1.join();
  List<ResultClass2> query2Results = future2.join();
  // more code...
  return someCombinedResult;
});

这使您可以在调用堆栈的整个过程中继续围绕假设的组合结果编写代码,这样您甚至可以返回到主流程的事件循环,从而使您的流程可以腾出时间做其他事情,直到查询完成为止。