2013-04-30 55 views
5

是否在nodejs中爲每個請求打開mongodb連接並在回調中關閉它是一個好習慣?mongodb nodejs本地驅動程序是否關閉連接

app.get('/some_route', function(){ 
     MongoClient.connect(url,function(err, db){ 
      //some db query with callback 
      db.collection("some_collection").findOne(doc, function(err,item){ 
       if(err){ 
         res.send(err); 
         //close db connection 
         db.close(); 
       }else{ 
         //do something with item 
         res.send(item); 
         //close db connection 
         db.close(); 
       } 

     }); 
    }); 

有的說,對每個請求打開/關閉的mongodb連接不是必要的,因爲一旦打開,連接池可以被共享。

問題是如何維護和共享該池?貓鼬是否已經自動做到了這一點?

尤其是,在mongodb超時或斷開連接時,是否需要重新連接?

我在這裏找到答案矛盾close mongodb connection per request or not

幾乎所有的在線文檔nodejs mongodb native driver和示例代碼我看了,一個db.open()是搭配db.close()某處回調。

因爲如果連接池是共享的,一個可能的代碼 根據christkv的回答,人們可能會代碼:

var p_db=null; 
var c_opt = {server:{auto_reconnect:true}}; 

app.get('/some_route', function(){ 
     //pseudo code 
    if (!p_db){ 
      MongoClient.connect(url, c_opt, function(err,db){ 
        p_db = db; 
        p_db.collection("some_collection").findOne(doc, function(err,item){ 
        if(err){ 
         res.send(err);       
        }else{ 
         //do something with item 
         res.send(item); 
        } 

      }); 
      }); 
     }else { 
      p_db.collection("some_collection").findOne(doc, function(err,item){ 
       if(err){ 
         res.send(err); 
       }else{ 
         //do something with item 
         res.send(item); 
       } 

     }); 
    }); 
+0

幾個月前我讀了mongoose src,他們爲每個集合打開一個連接,所以它只是緩存在變量中。不知道他們可能會改變。 我寫了一個連接模塊,並在app.listen之前運行它。 – wayne 2013-04-30 23:42:41

回答

5

你不必做任何事情來重新連接的驅動程序將嘗試重新連接失敗。當它等待重新連接發生時,它將緩衝所有在兩者之間發生的操作,並在連接結束後重播它們。如果你想自己控制這個,你可以監聽db實例上的「close」事件並手動處理重新連接。重新連接數據庫對象仍然可行,因爲數據庫實際上只是共享連接池的一個包裝,並且不包含它自己單獨的連接邏輯。

8

According to的主要貢獻者驅動程序源,這是最好的連接數據庫在啓動並保持重複使用每個請求相同的連接。

mongodb本地驅動程序具有一個連接池,它在內部維護並且當前缺省爲最多5個打開的連接。您可以通過maxPoolSize選項配置最大連接數。您也可以將連接配置爲使用auto_reconnect選項自動重新連接。

參見文檔here

相關問題