2012-04-18 78 views
6

我試圖使用MongoJS作爲Node中本地Mongo驅動程序的包裝。我使用類似populate(),save()等方法將我的集合中的文檔建模爲類。用MongoJS管理與Mongo的連接的正確方法是什麼?

在大多數語言(如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連接的正確方法是什麼?

回答

7

如果您保持連接處於打開狀態而不是斷開連接,您將從應用程序中獲得更好的性能。建立一個TCP連接,對於MongoDB來說,在適當的時候發現副本集/分片配置與實際處理查詢和更新所花的時間相比是相對昂貴的。這次最好「花費」一次,並保持連接暢通,而不是不斷重新做這項工作。

+2

有道理。當我不再需要對象(某種析構函數)時,是否有合適的時間來關閉連接?或者當JavaScript垃圾收集對MongoJS對象的引用時,驅動程序是否考慮到了這一點? 不調用close()永遠不會允許Node進程在所有調用完成時在控制檯中終止。 – DuxPrime 2012-04-18 19:52:16

5

不要爲每個查詢打開+關閉連接。打開連接一次,然後重新使用它。

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

我認爲它實際上關閉每個請求之後的連接,但它集{auto_reconnect:真正}在MongoDB服務器的配置,所以它將在需要時重新打開新的連接。

相關問題