首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时关闭Nodejs中的MongoDB数据库连接

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

Stack Overflow用户
提问于 2011-12-04 15:17:34
回答 8查看 79.4K关注 0票数 86

通过Node MongoDB本机驱动程序与Nodejs和MongoDB一起工作。需要检索一些文档,并进行修改,然后将它们保存回来。这是一个示例:

代码语言:javascript
复制
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()来释放资源?或者需要打开一个新的数据库连接?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-12-07 05:50:47

这里有一个基于计数方法的潜在解决方案(我还没有测试过它,也没有错误陷阱,但它应该传达了这个想法)。

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

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

代码语言:javascript
复制
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);
        }
      });
    })
  });
});
票数 28
EN

Stack Overflow用户

发布于 2014-12-27 20:25:22

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

代码语言:javascript
复制
process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);

请参阅http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html

有点旧的线程,但不管怎样。

票数 22
EN

Stack Overflow用户

发布于 2013-08-25 23:46:57

我发现使用计数器可能适用于简单的场景,但在复杂的场景中可能很难。这是我提出的一个解决方案,当数据库连接空闲时关闭数据库连接:

代码语言:javascript
复制
var dbQueryCounter = 0;
var maxDbIdleTime = 5000; //maximum db idle time

var closeIdleDb = function(connection){
  var previousCounter = 0;
  var checker = setInterval(function(){
    if (previousCounter == dbQueryCounter && dbQueryCounter != 0) {
        connection.close();
        clearInterval(closeIdleDb);
    } else {
        previousCounter = dbQueryCounter;
    }
  }, maxDbIdleTime);
};

MongoClient.connect("mongodb://127.0.0.1:27017/testdb", function(err, connection)(
  if (err) throw err;
  connection.collection("mycollection").find({'a':{'$gt':1}}).toArray(function(err, docs) {
    dbQueryCounter ++;
  });   
  //do any db query, and increase the dbQueryCounter
  closeIdleDb(connection);
));

这可以是任何数据库连接的通用解决方案。maxDbIdleTime可以设置为与数据库查询超时相同的值或更长的值。

这不是很优雅,但我想不出更好的方法来做到这一点。我使用NodeJs运行一个查询MongoDb和Mysql的脚本,如果数据库连接没有正确关闭,该脚本将永远挂起。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8373905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档