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

标签 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 线程并且每个线程都运行一个 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/

相关文章:

java - Spring + hibernate : how can I tell if spring has picked up all the @transactional annotation

java - 在 Spring Boot Controller 内有条件地更改 spring.datasource.url 变量值

java - @Autowiring 在现场级别不起作用

Java JTable - 透明与 Nimbus/System L&F

java - 如何循环回到程序开头

sql-server - SQL Server 和 Mongo 可以一起使用吗?

javascript - 使用 ObjectID 删除特定记录

java - 将参数从 PrimeFaces 数据表传递到托管 bean

java - Spring 拒绝缺少供应商 header 的请求(自定义 MIME 类型)

mongodb - 使用 mongoose 并利用我已经定义的 schmas 在 NestJS 中做种子 mongoDB 的正确方法是什么