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

问题描述 投票:0回答:1

我正在尝试使用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();
java concurrency spring-jdbc completable-future
1个回答
0
投票

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

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

[这使您可以在调用堆栈之前一直围绕假设的组合结果编写代码,这样您甚至可以返回到主流程的事件循环,这使您的流程可以腾出时间做其他事情,直到查询完成为止。] >

© www.soinside.com 2019 - 2024. All rights reserved.