一尘不染

何时在Node.js中关闭MongoDB数据库连接

node.js

通过Node MongoDB本机驱动程序使用Nodejs和MongoDB。需要检索一些文档,并进行修改,然后将其保存回来。这是一个例子:

db.open(function (err, db) {
  db.collection('foo', function (err, collection) {
    var cursor = collection.find({});
    cursor.each(function (err, doc) {
      if (doc != null) {
        doc.newkey = 'foo'; // Make some changes
        db.save(doc); // Update the document
      } else {
        db.close(); // Closing the connection
      }
    });
  });
});

具有异步性质,如果更新文档的过程花费更长的时间,则当光标到达文档末尾时,数据库连接将关闭。并非所有更新都保存到数据库。

如果db.close()省略,则所有文档均正确更新,但应用程序挂起,永不退出。

我看到一则帖子建议使用计数器跟踪更新次数,当回落到零时,然后关闭数据库。但是我在这里做错了吗?处理这种情况的最佳方法是什么?是否db.close()必须使用它来释放资源?还是需要打开新的数据库连接?


阅读 653

收藏
2020-07-07

共1个答案

一尘不染

这是一种基于计数方法的潜在解决方案(我尚未测试过,也没有错误陷阱,但应该可以传达出这种想法)。

基本策略是:获取需要更新的记录数,异步保存每个记录,并在成功时进行回调,这将减少计数并在计数达到0(最后一次更新完成时)时关闭数据库。通过使用{safe:true}我们可以确保每次更新均成功。

mongo服务器每个连接将使用一个线程,因此最好a)关闭未使用的连接,或b)池化/重用它们。

db.open(function (err, db) {
  db.collection('foo', function (err, collection) {
    var cursor = collection.find({});
    cursor.count(function(err,count)){
      var savesPending = count;

      if(count == 0){
        db.close();
        return;
      }

      var saveFinished = function(){
        savesPending--;
        if(savesPending == 0){
          db.close();
        }
      }

      cursor.each(function (err, doc) {
        if (doc != null) {
          doc.newkey = 'foo'; // Make some changes
          db.save(doc, {safe:true}, saveFinished);
        }
      });
    })
  });
});
2020-07-07