2012-04-18 11 views
6

MongoJSをNodeのネイティブMongoドライバのラッパーとして使用しようとしています。私はコレクション内のドキュメントをpopulate(),save()などのメソッドを持つJavaScriptクラスとしてモデル化しています。MongoJSとの接続を管理する適切な方法は何ですか?

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()メソッドを呼び出すと、私はもはや以降の呼び出しに新しい接続を開くことができないことを発見しています:

はここに関連するコードです。しかし、このメソッドを呼び出さないと、あたかもMongoからの切断を待っているかのように、すべての非同期呼び出しが終了するとNodeプロセスが終了することはありません。

MongoJSとの接続を管理する適切な方法は何ですか?

答えて

7

接続を切断するのではなく、接続を開いたままにすると、アプリケーションのパフォーマンスが向上します。 TCP接続を作成し、MongoDBの場合、必要に応じてレプリカセット/シャーディングの設定を検出するのは、実際にクエリや更新を処理するのに比べて比較的高価です。この作業を一度 "費やし"、この作業を常に再開するのではなく、接続を開いたままにする方が良いです。

+2

意味があります。オブジェクトが必要なくなったときに接続を閉じる適切な時間がありますか(ある種のデストラクタ)?または、JavaScriptのガベージがMongoJSオブジェクトへの参照を収集するときに、これがドライバによって考慮されますか? close()を呼び出さないと、すべての呼び出しが終了したときにノードプロセスがコンソールで終了することはありません。 – DuxPrime

5

すべてのクエリで接続を開いたり閉じたりしないでください。接続を一度開き、再使用してください。

2

すべてのために、この再利用するあなたのDB接続は、私はそれが実際に各要求後に接続を閉じますが、それは{auto_reconnect:真}を設定し、信じて

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

を呼び出すより多くのような何かを行うのMongoDBサーバ設定で、それ新しい接続が必要なときはいつでもそれを再開します。

関連する問題