假设我想要并行发送多个数据库查询(或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