簡體   English   中英

使用Stream API或CompletableFuture的並行數據庫查詢?

[英]Parallel db queries using Stream API or CompletableFuture?

假設我要並行發送多個數據庫查詢(或Web服務請求),然后將它們聚合。 我是否最好使用stream API或CompletableFuture

流:

List<Result> result = requests.parallelStream()
                              .map(req -> query(req.getFirstname, req.getLastname))
                              .collect(toList());

//a database, or a webservice
private Result query(firstname, lastname);

期貨:

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());
}

雖然stream肯定不那么冗長,但是出於什么原因應該首選哪一個?

旁注 :我知道我可以使用sql = :firstname IN (..) and ... :lastname IN(..)來查詢此示例。 但這只是關於使用流或期貨的例子。

該任務還可以是並行發送多個Web服務請求,而不是發送數據庫查詢。

正如您已經說過的:“ stream肯定不那么冗長”,難道不願意為您使用Stream 公平地說,我認為我們還應該使用Java 8 Stream API使用CompletableFuture重寫第二個示例代碼。

List<Result> result = requests.stream()
        .map(req -> CompletableFuture.supplyAsync(() -> query(req.getFirstname, req.getLastname)))
        .collect(toList()).stream()
        .map(f -> f.get()).collect(toList());

看起來它仍然比/冗長/冗長:

List<Result> result = requests.parallelStream()
        .map(req -> query(req.getFirstname, req.getLastname)).collect(toList());

但是,我認為這里的關鍵是如何設置並發線程號:通過並行流,線程號由CPU核心號ForkJoinPool.commonPool固定。 通常,這對於發送大量的Web / DB請求來說太小了。 例如,如果要發送數十/數百個web / db請求,則大多數情況下,使用20個或更多線程發送請求要比ForkJoinPool.commonPool定義的線程號快得多。 我個人也不知道在並行流中指定線程號的簡便方法。 您可以參考以下答案: custom-thread-pool-in-java-8-parallel-stream

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM