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

通过 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);
        }
      });
    })
  });
});

https://stackoverflow.com/questions/8373905/

相关文章:

ruby-on-rails - 安装 Mongoid 后使用 Active Record 生成器?

node.js - 记录所有在应用程序中触发的 mongoose 查询

node.js - 在 node.js 中模拟数据库?

mongodb - Mongoose 限制/偏移和计数查询

mongodb - 如何在 MongoDB 中清除控制台

mongodb - 如何从 MongoDB shell 连接到副本集?

node.js - 无法连接到 127.0.0.1 :27017, 原因:errno:111 连接被

linux - 为什么在 Linux 上出现错误 mongod dead 但 subsys 被锁定和

mongodb - 将json文件插入mongodb

javascript - 键名中的 MongoDB 点 (.)