更新于2021-05-15
最近对MongoDB连接池如何正确使用不是特别清楚,于是做了一些测试也查找了相关资料,终于知道了MongoDB的连接池是怎么工作的了。
首先,在 nodejs web 应用中正确使用MongoDB,应该先 MongoClient.connect ,回调中会得到 client,然后 let db = client.db() ,将这个db作为全局对象使用即可,任何请求都可以使用db去执行语句。这是正确的,Stack Overflow上的答案也是一致的。
连接池是怎么工作的:
1、Mongo Server会监听连接,当有连接打开或关闭时,Mongo Server都会记录日志,这样就可以知道,当前有几个连接,连接到数据库
2、当使用 MongoClient.connect 建立连接之后,不执行任何操作,日志会显示有 1 个新的连接建立。
3、当使用 MongoClient.connect 建立连接之后,然后执行 1 条语句,日志会显示有 2 个新的连接建立。
4、当使用 MongoClient.connect 建立连接之后,然后同时执行 2 条语句,日志会显示有 3 个新的连接建立。
5、当使用 MongoClient.connect 建立连接之后,然后执行 1 条语句,然后在上一条语句的回调中再执行 1 条语句,日志会显示有 2 个新的连接建立。
6、当使用 MongoClient.connect 建立连接之后,然后同时执行 2 条语句,过5秒,再同时执行 2 条语句,日志会显示有 3 个新的连接建立。
得出结论:
当使用 MongoClient.connect 建立连接之后,会产生一个连接池,同时带有 1 个公共连接,一直存在,不是用来执行语句的。执行语句会新建立另外 1 个连接。
如果有 1 个执行语句的连接空闲,突然要执行 2 个语句,空闲的 1 个连接会马上安排上,并且会再建立一个新的连接用于执行另外的语句。
总之就是,如果连接池中没有空闲的连接,会新建连接,如果有空闲的就会重用空闲连接,连接不会关闭,查询连接的个数就是执行语句的并发数。
补充:connect方法也提供了选项可以设置连接池最小和最大的连接数
const MongoClient = require('mongodb').MongoClient;
const njjn = require('./njjn');
MongoClient.connect(
'mongodb://127.0.0.1:27017/randspace',
{
useNewUrlParser: true,
useUnifiedTopology: true,
minPoolSize: 3, //会初始化3个查询语句的连接,一共4个连接
maxPoolSize: 10
},
function(err, client) {
global.db = client.db();
njjn.start();
}
);
That's all. Good job.
标签:语句,NodeJS,MongoDB,连接池,执行,连接,MongoClient,connect From: https://blog.51cto.com/u_13128132/6096457