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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (126)

通过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()必须以释放资源?还是需要打开一个新的数据库连接?

提问于
用户回答回答于

基本策略是:获取有多少记录需要更新的计数,异步保存每条记录和成功回调,如果计数达到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);
        }
      });
    })
  });
});
用户回答回答于

最好使用池连接,然后在应用程序生命周期结束时,在清理函数中调用db.close():

process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动