MongoDB连接池理解及测试 NodeJS

Posted Rand Tsui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB连接池理解及测试 NodeJS相关的知识,希望对你有一定的参考价值。

更新于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.

以上是关于MongoDB连接池理解及测试 NodeJS的主要内容,如果未能解决你的问题,请参考以下文章

在 mongodb-native NodeJS 中为每个子进程使用集群的单个连接池与多个连接池

mongodb如何管理连接的?有必要实现连接池吗

Golang MongoDB 连接池缺陷及修复

Kafka 安装教程 + nodejs 连接

具有多个查询的NodeJS mysql连接池

nodejs之memcache连接池应用方法