繁体   English   中英

通过并行加速mongo查询并使用ThreadPool?

[英]Speed up mongo queries by parallel them and use a ThreadPool?

我们的mongodb架构每周存储数据。 每周都有它自己的数据库与相同的集合集。 有时我必须检查数据超过12周,这意味着我在12个不同的数据库(所有在一个mongo服务器上)运行相同的查询:

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

在这种情况下,我按顺序运行12次find()。 我猜内部连接池处理它们还是? 如果不是,如果我创建12个Java线程并且每个线程将运行一个查找,那么它会是一个好处吗? 也许喜欢:

public class FindTask {

    @Autowired
    MyMongoRepo repo;

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

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

连接池处理连接,仅此而已:

在软件工程中,连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重用连接

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

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

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

在性能方面如果查询需要很长时间,第二个解决方案应该更快(完成时间),但它使用更多资源(ram,cpu时间)。 请注意,时间也受MongoDB架构的影响。 如果您的查询在同一磁盘上运行长磁盘操作,则可能并行化它们并不会改善总时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM