当前位置: 首页 > 知识库问答 >
问题:

mongodb nodejs本机驱动程序是否关闭连接

胡鸿志
2023-03-14

在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超时或断开连接时,是否需要重新连接?

我在这里发现了相互矛盾的答案:是否根据请求关闭mongodb连接

我读到的几乎所有在线doc nodejs mongodb本机驱动程序和示例代码都是db。open()与db配对。在回调函数中的某个地方关闭()。

因为如果共享连接池,人们可能会编码 根据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);
                }

      });
    });

共有2个答案

宁飞宇
2023-03-14

你不需要做任何事情来重新连接,因为驱动程序会在出现故障时尝试重新连接。在等待重新连接发生时,它将缓冲其间发生的所有操作,并在连接结束后重播这些操作。如果你想自己控制它,你可以监听db实例上的“关闭”事件,并手动处理重新连接。在重新连接时,db对象仍然是可行的,因为db实际上只是共享连接池的包装器,不包含它自己的独立连接逻辑。

锺玺
2023-03-14

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

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

请参阅此处的文档

 类似资料:
  • 我有一个同时进行5次查询的应用程序,我可能需要在所有查询完成之前退出该应用程序,我想知道如何取消我的MongoClient正在进行的所有当前操作并关闭连接。 从我在stackoverflow中读到的另一个问题中,没有必要关闭或处置MongoClient中的连接,因为客户端会自动处理它,因此客户端会在应用程序退出时关闭连接,但客户端会等待这些查询完成后自动关闭还是会立即关闭?如果它等待,我如何让它取

  • 我们正在尝试使用nodejs/mongo原生驱动程序实现下面演示(幻灯片13-18)中概述的策略。 https://www.slideshare.net/mongodb/securing-mongodb-to-serve-an-awsbased-multitenant-securityfanatic-saas-application 总结: 从node.js.创建到mongoDB的连接池 对于租户

  • 在我们正在处理的应用程序中,用户可以通过在文本字段中输入任意的JDBC连接URL来连接到外部RDBMS。我们的一个客户报告说,当他无意中试图连接到带有MySQL JDBC URL的Microsoft SQL server时,我们的应用程序服务器在0%的CPU下冻结(无限期)。 下面的Java片段说明了这种情况: 运行代码段: null 问题: 1)这可能是MariaDB JDBC驱动程序中的一个b

  • 这是我在运行上述程序时遇到的错误。有人解决了这个问题吗? 我尝试过改变Selenium和ChromeDriver的版本,但没有任何效果。

  • 问题内容: 在Go中,当使用SQL数据库时,是否需要在关闭应用程序之前关闭DB()?数据库是否会自动检测到连接已终止? 问题答案: DB将尽其所能进行检测,但是如果没有运气,它可能无法检测到。最好尽快发布所获得的东西。 系统调用将等待TCP连接发送数据,但客户端不会收到任何信息。 发生电源故障,网络问题或裸机退出而没有正确释放资源。TCP keepalive机制将启动,并尝试检测连接已死。 客户端