【问题标题】:How to close all connections to the MongoDB server如何关闭与 MongoDB 服务器的所有连接
【发布时间】:2012-01-12 05:08:25
【问题描述】:

我使用Node MongoDB native driver连接MongoDB数据库:

// Open a connection
db.open(function (err, db) {
  db.close();
});

// Open another connection
db.open(function (err, db) {
  db.close();
});

我看到mongodb.log 文件中接受了两个连接,但只有一个端连接。并且程序没有退出,我认为它仍在等待关闭第二个连接。如何关闭所有连接?

【问题讨论】:

  • 程序没有退出可能还有其他原因。
  • 这就是测试程序中的所有代码。顺便说一句,这是非常快速的反应。
  • 能否在关闭调用之前添加一些调试输出以查看回调是否被调用?
  • 在回调前后添加了一些调试输出:gist.github.com/1598987

标签: node.js mongodb


【解决方案1】:

你正在用你的回调参数隐藏你的变量db

试试这个吧。

// Open a connection
db.open(function (err, p_db) {
  db.close();
}); 

// Open another connection
db.open(function (err, p_db) {
  db.close();
});

更新:好吧,我想我对回调中的参数感到困惑,抱歉。 您的问题(来自要点)是因为您在关闭它们之前使用相同的 db 对象执行两个 db.opens。此外,除非您按顺序执行操作,否则您似乎需要单独的服务器对象。

所以,如果你想按顺序保证它,你可以做的是(另外,我拥有的mongodb版本似乎没有定义_serverState,所以我将其更改为connected):

console.log('[1]', db.serverConfig.connected);
db.open(function (err, db) {
  console.log('[2]', err, db.serverConfig.connected);
  db.close();
  console.log('[3]', err, db.serverConfig.connected);

  console.log('[4]', db.serverConfig.connected);
  db.open(function (err, db) {
    console.log('[5]', err, db.serverConfig.connected);
    db.close();
    console.log('[6]', err, db.serverConfig.connected);
  });
});

哪些打印:

[1] false
[2] null true
[3] null false
[4] false
[5] null true
[6] null false

或者,您可以定义两个数据库变量——但您还需要定义两个服务器变量,否则在第一个关闭后它会挂起。像这样:

var mongodb  = require('mongodb')
  , server   = new mongodb.Server('localhost', 27017, {})
  , server2   = new mongodb.Server('localhost', 27017, {})
  , db       = new mongodb.Db('test', server, {})
  , db2       = new mongodb.Db('test', server2, {})
  ;

console.log('[1]', db.serverConfig.connected);
db.open(function (err, db) {
  console.log('[2]', err, db.serverConfig.connected);
  db.close();
  console.log('[3]', err, db.serverConfig.connected);
});

console.log('[4]', db2.serverConfig.connected);
db2.open(function (err, db2) {
  console.log('[5]', err, db2.serverConfig.connected);
  db2.close();
  console.log('[6]', err, db2.serverConfig.connected);
});

哪个打印(对我来说,我猜你不能指望 1,4,2,3...的顺序):

[1] false
[4] false
[2] null true
[3] null false
[5] null true
[6] null false

【讨论】:

  • 谢谢,但结果相同。 dbp_db 在回调中引用同一个对象。因此,在函数中使用db 并不会隐藏函数之外的那个。
  • 其实参数通常是collection对象,而不是db对象。我将在我自己的系统上进行测试。等一下。
  • 谢谢,两个版本都可以。现在我想知道我是怎么做的,为什么第二个db.open 不会阻止我建立连接,因为同一个数据库对象正试图从第一个db.open 连接到同一个服务器。另一个问题是,如果一个db对象有多个连接,db.close应该全部关闭吗?
  • 我不认为它应该首先打开多个连接——无论哪种方式都值得报告为错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多