假設我想要並行發送多個數據庫查詢(或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);
期貨:
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());
}
雖然流肯定是更簡潔,但哪一個應首選是什麼原因呢?
旁註:我知道我可以用sql = :firstname IN (..) and ... :lastname IN(..)
更容易地查詢這個例子。但這只是使用流或期貨的一個例子。
該任務也可以並行發送多個webservice請求,而不是db查詢。
你會讀這嗎?它可能無法工作... https://stackoverflow.com/questions/44029856/using-jpa-objects-in-parallel-streams-with-spring – Eugene
我會說廣泛和基於意見。主要的牛肉是相同的(並行運行的東西),你的示例代碼甚至都使用公共池。我想說這主要取決於其他代碼的存在。 – Kayaman
@Eugene當然取決於你在什麼時候將EntityManager綁定到線程。給出的例子並未顯示與鏈接問題類似的「線程交叉」。 – Kayaman