检查下面的代码:
const mongodb = require('mongodb');
const express = require('express');
const app = express();
let db;
const options = {};
mongodb.MongoClient.connect('mongodb://localhost:27017/test', options, function(err, database) {
if (err) throw err;
db = database.db('test');
app.listen(process.env.PORT || 3000, function() {
console.log(`Express.js server up.`);
});
});
app.get('/', function (req, res) {
db.collection('test').countDocuments({}, function(err, count) {
return res.json({'documentCount': count});
});
});
这是在 MongoDB 中执行计数操作的简单代码。我对上述代码的理解是,我创建一个MongoDB连接并将其分配给db
,然后在需要执行查询的地方重用它。
每次
.connect()
创建一个新的连接池,而不是一个连接
另外,这篇文章指出:
池大小是确定使用同一连接可以并行运行多少个查询的选项,类似于隧道中的车道数量。
如果该connect()
方法正在创建 apool
而不是connection
,那么在什么时候创建连接?query
每个都在指定的池中创建一个新连接(或重用)吗?
如果我.connect()
在代码中仅使用poolSize: 5
. 它会立即创建 5 个连接吗?
当您调用 时
mongodb.MongoClient.connect
,您实际上是在创建一个连接池,而不仅仅是与 MongoDB 的单个连接。该池包含许多可重复用于不同查询的连接,这是在可能发生许多并发操作的环境中处理数据库交互的有效方法。在您的代码中,当您调用 时
mongodb.MongoClient.connect
,它会初始化一个连接池,并且该db
变量保存对此池的引用。然后,每当您执行类似 的查询时db.collection('test').countDocuments({}, function(err, count) {...}
,就会从池中借用一个连接来执行查询,并在查询执行完成后将连接返回到池中。从文档中, connect() 方法将您创建的客户端
mongodb.MongoClient
连接到MongoDB Atlas 部署、MongoDB 实例或 mongoDB 驱动程序的副本集,这会创建一个连接池。
然后,池中的并发连接数由 mongoDB 驱动程序根据工作负载的需要进行内部管理。
但是,在连接选项中,您可以覆盖默认设置,包括该客户端可以有多少个并发连接(使用 和
maxPoolSize
选项minPoolSize
;默认值为 100)。但我认为只有在您收集指标并密切监控 MongoDb 时才建议覆盖默认设置。然后,您可能想使用覆盖设置对其进行微调
请参阅mongoDb 社区论坛中的这个非常好的答案,了解更多详细信息。