2013-04-30 17 views
5

各リクエストごとにmongodb接続を開いてコールバックで閉じるのは、nodejsの良い方法ですか?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()どこかと対になっています。

接続のプールが共有されている場合、1はchristkvの答えによると をコード化する可能性があるため、1つのかもしれないコード:

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を読んでいます。コレクションごとに1つの接続をオープンしているので、変数にキャッシュされているだけです。彼らが変わったかもしれないと確信している 私は接続のためのモジュールを書いてapp.listenの前に実行します。 – wayne

答えて

5

を参照してください。再接続が起こるのを待つ間、それは起こっているすべての操作をバッファリングし、接続が確立したら再生します。これを自分で制御したい場合は、dbインスタンスの "close"イベントをリッスンし、手動で再接続を処理できます。再接続すると、dbは共有接続プールのまわりのラッパーであり、独自の別の接続ロジックを含まないため、dbオブジェクトは実行可能です。

8

According toドライバのソースの主な要因は、それはに接続することをお勧めしますデータベースを起動し、各要求に対して同じ接続を再利用し続けます。

mongodbネイティブドライバには内部的に維持する接続プールがあり、現在デフォルトで最大5つのオープン接続が設定されています。 maxPoolSizeオプションを使用して最大接続数を設定できます。 auto_reconnectオプションで自動再接続するように接続を設定することもできます。

あなたは、ドライバが失敗した場合に再接続を試みますように再接続するために何かをする必要はありません文書here

関連する問題