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

时间:2012-04-18 18:44:11

标签: javascript node.js mongodb

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

在大多数语言中,如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();
    });
};

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

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

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

答案 2 :(得分: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);
      }
  });
};

答案 3 :(得分:0)

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