mongodb nodejs原生驱动是不是关闭连接

Posted

技术标签:

【中文标题】mongodb nodejs原生驱动是不是关闭连接【英文标题】:mongodb nodejs native driver close connection or notmongodb nodejs原生驱动是否关闭连接 【发布时间】:2013-04-24 22:00:59 【问题描述】:

在 nodejs 中每个请求打开 mongodb 连接并在回调中关闭它是一种好习惯吗?

app.get('/some_route', function()
      MongoClient.connect(url,function(err, db)
          //some db query with callback
          db.collection("some_collection").findOne(doc, function(err,item)
               if(err)
                      res.send(err);
                      //close db connection 
                      db.close();
                else
                      //do something with item
                      res.send(item);
                      //close db connection 
                      db.close();
                

      );
    );

有人说不需要在每个请求上打开/关闭 mongodb 连接,因为一旦打开,就可以共享一个连接池。

问题是如何维护和共享该池?猫鼬已经自动这样做了吗?

特别是mongodb超时或断开连接,是否需要重新连接?

我在这里找到矛盾的答案close mongodb connection per request or not

几乎所有在线文档nodejs mongodb native driver 和我阅读的示例代码,一个 db.open() 在回调的某处与 db.close() 配对。

因为如果一个连接池是共享的,人们可能会编码 根据 christkv 的回答,可以编码:

var p_db=null;
var c_opt = server:auto_reconnect:true;

app.get('/some_route', function()
      //pseudo code
    if (!p_db)
           MongoClient.connect(url, c_opt, function(err,db)
                  p_db = db;
                  p_db.collection("some_collection").findOne(doc, function(err,item)
                  if(err)
                      res.send(err);                          
                  else
                      //do something with item
                      res.send(item);
                  

             );
           );
       else 
          p_db.collection("some_collection").findOne(doc, function(err,item)
               if(err)
                      res.send(err);
                else
                      //do something with item
                      res.send(item);
                

      );
    );

【问题讨论】:

几个月前我阅读了 mongoose src,他们确实为每个集合打开一个连接,因此它只是缓存在变量中。不确定他们可能会改变。我确实编写了一个连接模块并在 app.listen 之前运行它。 【参考方案1】:

According to 驱动程序源的主要贡献者,最好在启动时连接到数据库,并为每个请求重复使用相同的连接。

mongodb 本机驱动程序有一个连接池,它在内部维护,目前默认最多打开 5 个连接。您可以通过maxPoolSize 选项配置最大连接数。您还可以使用auto_reconnect 选项将连接配置为自动重新连接。

查看文档here

【讨论】:

【参考方案2】:

您无需执行任何操作即可重新连接,因为驱动程序会在失败时尝试重新连接。在等待重新连接发生时,它将缓冲其间发生的所有操作,并在连接建立后重播它们。如果您想自己控制它,您可以在 db 实例上收听“关闭”事件并手动处理重新连接。在重新连接时,db 对象仍然是可行的,因为 db 实际上只是共享连接池的一个包装器,并且不包含它自己的单独连接逻辑。

【讨论】:

以上是关于mongodb nodejs原生驱动是不是关闭连接的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB: Aggregation - 是不是有相当于原生 node.js 驱动程序的 $lookup 连接?

从 NodeJS 原生 mongodb 驱动程序获取 MongoDB 操作 id 以用于 db.killOp

mongodb驱动的正确使用方法

何时在 Nodejs 中关闭 MongoDB 数据库连接

Mongo 连接流在 NodeJS 应用程序中意外关闭

如何检查MongoDB本机nodejs驱动程序中是不是存在集合?