8

在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 连接

我阅读的几乎所有在线文档nodejs mongodb 本机驱动程序和示例代码,一个 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);
                }

      });
    });
4

2 回答 2

9

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

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

请参阅此处的文档

于 2013-05-01T00:40:39.957 回答
5

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

于 2013-05-03T16:09:22.057 回答