加快蒙戈查询由平行它们,并使用线程池?

问题描述 投票:1回答:1

我们的MongoDB的架构存储数据每周一次。每周都有它自己的数据库具有相同收集组。有时候,我要检查数据长达12周以上,这意味着我跑了12个不同的数据库(所有一个蒙戈服务器上)相同的查询:

...
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());
    }
}

哪种方法实际上是快还是有在检索数据没有速度差?

java spring mongodb threadpool connection-pooling
1个回答
3
投票

connection pool手柄的连接,仅此而已:

在软件工程中,连接池是保持,以便连接可以重复使用的数据库连接的缓存时,需要未来的数据库请求

为了您的第一个代码,这意味着后的第一个发现已经完成,而不是建立新连接到MongoDB的可重用存在于池中现有的已经打开,而不是使用的连接。

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

在第二种情况下,必须使用在同一时间12不同的连接12个并行查询。

在性能方面,如果查询需要很长一段时间的第二个解决方案应该更快(时间才能完成),但它使用更多的资源(内存,CPU时间)。请注意,时间也由你的MongoDB架构的影响。如果查询与长盘操作在同一磁盘上操作可能并行他们不会提高太多的总时间。

© www.soinside.com 2019 - 2024. All rights reserved.