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

时间:2016-11-25 14:33:32

标签: java spring mongodb threadpool connection-pooling

我们的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());
    }
}

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

1 个答案:

答案 0 :(得分:3)

docs处理连接,仅此而已:

  

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

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

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

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

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