5

我正在尝试使用MongoJS作为 Node.js 中本机 Mongo 驱动程序的包装器。我正在将集合中的文档建模为 JavaScript 类,其中包含populate(),save()等方法。

在 C# 和 Java 等大多数语言中,我习惯于为每个查询显式连接然后断开连接。大多数示例仅提供连接示例,但在完成后从不关闭连接。我不确定驱动程序是否能够自行管理,或者我是否需要自己手动管理。文档很少。

以下是相关代码:

User.prototype.populate = function(callback) {
    var that = this;    

    this.db = mongo.connect("DuxDB");
    this.db.collection(dbName).findOne({email : that.email}, function(err, doc){
        if(!err && doc) {
            that.firstName  = doc.firstName;
            that.lastName   = doc.lastName;
            that.password   = doc.password;
        }

        if (typeof(callback) === "function"){
            callback.call(that);
        }

        that.db.close();
    });
};

我发现,一旦我close()在 MongoJS 对象上调用该方法,我就无法再在后续调用中打开新连接。但是,如果我不调用此方法,那么一旦所有异步调用完成,Node 进程就永远不会终止,就好像它正在等待与 Mongo 断开连接一样。

使用 MongoJS 管理与 Mongo 的连接的正确方法是什么?

4

4 回答 4

7

如果您保持连接打开而不是断开连接,您将从应用程序中获得更好的性能。与实际处理查询和更新所花费的时间相比,建立 TCP 连接,并且在 MongoDB 的情况下,在适当的情况下发现副本集/分片配置是相对昂贵的。最好“花费”一次并保持连接打开,而不是不断地重新做这项工作。

于 2012-04-18T19:15:41.610 回答
5

不要为每个查询打开 + 关闭连接。打开连接一次,然后重新使用它。

于 2012-04-18T19:14:35.417 回答
2

做更多类似这样的事情,为所有调用重用你的数据库连接

User = function(db) {
  this.db = db;
}


User.prototype.populate = function(callback) {
  var that = this;  
  this.db.collection(dbName).findOne({email : that.email}, function(err, doc){
      if(!err && doc) {
          that.firstName  = doc.firstName;
          that.lastName   = doc.lastName;
          that.password   = doc.password;
      }

      if (typeof(callback) === "function"){
          callback.call(that);
      }
  });
};
于 2012-04-18T19:38:29.210 回答
0

我相信它实际上会在每次请求后关闭连接,但它会在 mongodb 服务器配置中设置 {auto_reconnect:true} ,因此它会在需要时重新打开一个新连接。

于 2012-08-27T15:52:54.070 回答