[英]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.