gpt4 book ai didi

java - 通过并行查询并使用线程池来加速 mongo 查询?

转载 作者:行者123 更新时间:2023-11-29 04:37:17 26 4
gpt4 key购买 nike

我们的 mongodb 架构每周存储数据。每周都有自己的数据库,其中包含相同的集合集。有时我必须检查长达 12 周以上的数据,这意味着我在 12 个不同的数据库(全部在一个 mongo 服务器上)上运行相同的查询:

...
for (MongoOperationDto week : allWeeks) {
results.addAll(repo.find(gid, week.db(), week.collection());
}
...

在这种情况下,我连续运行了 12 次 find()。我猜是内部连接池处理它们还是?如果不是的话,如果我创建 12 个 Java 线程并且每个线程都运行一个 find 会有好处吗?也许像:

public class FindTask {

@Autowired
MyMongoRepo repo;

@Async
public List<Result> doFindTask(long gid, MongoOperationDto week) {
return repo.find(gid, week.db(), week.connection());
}
}

哪种方法实际上更快,或者在检索数据时没有速度差异?

最佳答案

connection pool处理连接,仅此而已:

In software engineering, a connection pool is a cache of database connections maintained so that the connections can be reused when future requests to the database are required

对于您的第一个代码,这意味着在第一个查找完成后,它可以重用池中现有的已经打开但未使用的连接,而不是建立与 MongoDB 的新连接。

因此在第一种情况下,您将有 12 个串行查询和一个用于每个查询的连接。

在第二种情况下,您有 12 个并行查询,同时使用 12 个不同的连接。

就性能而言,如果查询需要很长时间,第二种解决方案应该更快(完成时间),但它使用更多资源(ram、cpu 时间)。请注意,该时间还受您的 MongoDB 架构影响。如果您的查询在同一磁盘上进行长磁盘操作,可能将它们并行化并不会减少太多总时间。

关于java - 通过并行查询并使用线程池来加速 mongo 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40807257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com