我们的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());
}
}
哪种方法实际上更快或者在检索数据方面没有速度差异?
答案 0 :(得分:3)
docs处理连接,仅此而已:
在软件工程中,连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重用连接
对于您的第一个代码,这意味着在完成第一个查找而不是建立与MongoDB的新连接之后,它可以重用池中存在的现有已打开且未使用的连接。
因此,在第一种情况下,每个查询将有12个串行查询和1个连接。
在第二种情况下,您有12个并行查询同时使用12个不同的连接。
在性能方面,如果查询需要很长时间,第二个解决方案应该更快(完成时间),但它使用更多资源(ram,cpu时间)。请注意,时间也受MongoDB架构的影响。如果您的查询在同一磁盘上使用长磁盘操作,则可能并行化它们不会改善总时间。