用MongoJSpipe理Mongo连接的正确方法是什么?

我试图使用MongoJS作为Node中本地Mongo驱动程序的包装。 我使用populate()save()等方法将我的集合中的文档build模为JavaScript类。

在大多数语言,如C#和Java,我习惯于显式连接,然后断开每个查询。 大多数例子只给出了一个连接的例子,但是完成后从来没有closures连接。 我不确定驱动程序是否能够自行pipe理,或者是否需要自己手动执行。 文档是稀疏的。

以下是相关的代码:

 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()方法,我就不能再在随后的调用中打开一个新的连接。 但是,如果我不调用这个方法,一旦所有asynchronous调用完成,Node进程就不会终止,就好像它正在等待与Mongo断开连接一样。

用MongoJSpipe理Mongo连接的正确方法是什么?

如果您保持连接处于打开状态,而不是断开连接,则您的应用程序将获得更好的性能。 build立一个TCP连接,对于MongoDB来说,在适当的时候发现副本集合/分片configuration,与实际处理查询和更新的时间相比,是相对昂贵的。 这次最好“花”一次,保持连接畅通,而不是不断重新做这项工作。

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

做更像这样的重用所有调用你的数据库连接

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

我相信它实际上在每次请求后closures连接,但是它在mongodb服务器configuration中设置{auto_reconnect:true},所以只要需要,它就会重新打开一个新的连接。