当前位置: 首页 > 面试题库 >

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

窦弘义
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 我并不像php开发人员,但我必须使用它,而且我不太了解PHP在会话期间如何处理内存分配。 我正在开发一个要求进行HTTP身份验证的应用程序,一旦登录,便可以通过一个漂亮的界面来操作数据。 有人在另一篇文章中告诉我,我不应该在每次执行后关闭mysql数据连接,但是我不知道在使用此应用程序期间该连接如何保持内存,因为在服务器端我不知道PHP保留了什么内容记忆与否。 所以我的问题是我应该使用

  • 问题内容: 我有些困惑,我从阅读以下内容 你不需要关闭conn连接吗?如果conn.close()没有发生,那实际上是怎么回事? 我有一个正在维护的私有Web应用程序,该应用程序当前无法关闭任何一种形式,但是重要的应用程序真的是stmt,conn还是两者兼而有之? 该站点间歇性地关闭,但是服务器一直在说这是数据库连接问题,我怀疑它没有关闭,但是我不知道该关闭哪个。 问题答案: 使用完之后,你需要通

  • 我正在使用Knex.js来处理与数据库的连接。我正在尝试防止连接池破坏空闲的连接。 我的配置是这样的 然而,我仍然不断得到 在一段时间不活动后。 据我所知,当足够的时间过去时,应该将连接从池中丢弃。因此,如果连接有一段时间没有使用(这就是我的情况),池中将没有连接,我尝试的第一次调用将失败,并出现给定错误。随后的调用顺利进行(直到新的超时) 我的问题是——如何防止这种情况? 编辑 在我的应用空闲一

  • 在操作 MongoDB 数据库之前我们需要先连接数据库,您可以使用 MongoDB shell 来连接 MongoDB,也可以使用 PHP、Java 等编程语言来连接 MongoDB,本节我们主要介绍一下使用 MongoDB shell 来连接 MongoDB。 在连接 MongoDB 之前,我们需要先启动 MongoDB,启动 MongoDB 的方式非常简单,您只需要在 MongoDB 安装目录

  • 问题内容: 我试图在以下位置找到针对此问题的解决方案:http : //mongodb.github.io/node-mongodb-native/ 但是,我找不到从Node.js应用程序列出所有可用的MongoDB数据库的解决方案。 问题答案: 使用。

  • 我有一个在wildfly 8.1下运行的应用程序,应用程序中使用的数据库连接来自standalone中定义的数据源。xml文件。 问题:我不知道为什么,但池中的连接从不空闲,并且会被释放。最终,池被填满,所有活动连接和应用程序开始抛出 同时,当我查看数据库时,大多数连接显示为空闲。(配置和结果输出如下) 我已经做了一个星期了,还没能找出这个问题的根本原因。我还检查了所有创建连接的地方,并确保它们在