首页 > 数据库 >【MongoDB】连接池理解及测试 NodeJS

【MongoDB】连接池理解及测试 NodeJS

时间:2023-03-02 17:04:31浏览次数:46  
标签:语句 NodeJS MongoDB 连接池 执行 连接 MongoClient connect

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

相关文章

  • 【NodeJS】【pm2】加参数运行
    nodeindex.jsarg1arg2pm2startindex.js--arg1arg2上面两个等价 获取参数process.argv返回一个数组如下:['/usr/bin/node','/usr/lib/node_mod......
  • 【NodeJS】CommonJS原理
    (function(modules){varinstalledModules={};function__webpack_require__(moduleId){if(installedModules[moduleId]){return......
  • 【NodeJS】最小服务器
    consthttp=require('http');constfs=require('fs');http.createServer((req,res)=>{leturl=req.url;console.log(url);switch(req.me......
  • MongoDB添加远程连接访问
    在bin文件夹下增加配置 mongod.cfgsystemLog:destination:filepath:c:\data\log\mongod.logstorage:dbPath:c:\data\dbnet:bindIp:127.0.0.1......
  • .Net6 + GraphQL + MongoDb全局状态
    介绍文本说一下全局状态,这个东西还是比较有意思,他就像我们系统使用的时候业务中比如要拿当前用户ID、租户数据什么的。正文我们使用拦截器(Interceptor)来做一个Global......
  • .Net6 + GraphQL + MongoDb 实现GraphQL的认证和授权
    介绍文本说一下认证和授权,因为GraphQL的特殊性他不能直接使用微软提供的授权来做正文关于认证我这边没有自己写,我采用了okta提供的第三方认证服务,builder.Services.Add......
  • 记一次druid 数据库连接池遇到 union或者union all语句时报错以及处理
    报错日志大概如下:##Errorupdatingdatabase.Cause:java.sql.SQLException:sqlinjectionviolation,syntaxerror:syntaxerror,errorin:'UNIONALL......
  • Nodejs:ESModule和commonjs,傻傻分不清
    最近写nodejs脚本的时候遇到了commonjs和ESModule的问题,正好之前用得稀里糊涂的,这次好好学习一下。ESModule导出仅导出namedexports:命名导出,每次可以导出一个或......
  • nodejs配合jwt
    使用npm下载包:npmijsonwebtoken--save引入此包:constjsonwebtoken=require('jsonwebtoken');JWT的组成:JWT由三部分组成,每一部分使用“.”进行分割这三部分分别是......
  • 03_07_JavaWeb||day06_JDBC连接池&JDBCTemplate||day06_JDBC连接池&JdbcTemplate(Sprin
    今日内容数据库连接池【重要】SpringJDBC:JDBCTemplate【简化JDBC】1.数据库连接池(容器)获取连接(Connection)的操作,是向底层申请资源,过程非常浪费时间概念:其实就是一个容......