複数のデータベースクエリ(またはWebサービスリクエスト)を並行して送信し、後でそれらを集約したいとします。 stream
APIまたはCompletableFuture
を使用することをおすすめしますか?Stream APIまたはCompletableFutureを使用した並列dbクエリ?
STREAM:
List<Result> result = requests.parallelStream()
.map(req -> query(req.getFirstname, req.getLastname))
.collect(toList());
//a database, or a webservice
private Result query(firstname, lastname);
FUTURES:
List<CompletableFuture> futures;
for (QueryReq req: requests) { //given input
futures.add(CompletableFuture
.supplyAsync(() -> query(req.getFirstname, req.getLastname));
}
//wait for all futures to complete and collect the results
List<Result> results = new ArrayList<>();
for (CompleteableFuture f : futures) {
results.add(f.get());
}
流れは確かに少ない冗長ですが、どちらがどのような理由のために好まれる必要がありますが?
Sidenote:この例をSQL = :firstname IN (..) and ... :lastname IN(..)
で簡単にクエリできます。しかし、ストリームや先物を使うのは単なる例です。
タスクは、dbクエリではなく、複数のWebサービス要求を並列に送信することもできます。
あなたはこれも読んでいますか?それはまったく動作しないかもしれません... https://stackoverflow.com/questions/44029856/using-jpa-objects-in-parallel-streams-with-spring – Eugene
私は広いと意見に基づいて言うでしょう。メインビーフは同じです(並列実行されているもの)、サンプルコードでも両方の共通プールが使用されています。私はそれが主に他のコードが存在するかどうかに依存していると言いたい。 – Kayaman
@Eugeneはもちろん、あなたがスレッドに 'EntityManager'をバインドしている時点に依存しています。この例では、リンクされた質問と同様の「スレッドクロス」は表示されません。 – Kayaman