2012-06-03 10 views
9

私はMongoose(永続ストレージ用にMongoDBを使用するnode.jsのORM)を評価しています。Mongoose DB接続の中断を処理する方法

私がしたいのは、アプリの起動時にDBが起動していないときにアプリが実行できることと、DBがインテリジェントに処理されることを確認することです。

現在、いずれの場合には動作しません。私のテストのアプリは、これを行います:モデルを作るとき

var mongoose_connection = mongoose.createConnection(DATABASE_URL, {server:{poolSize:4}}); 

は、それから私は、その接続を使用します。

アプリケーションの開始時にDBがダウンしている場合、インスタンス上のsave()呼び出しは何もエラーなく失敗します。 DBが復旧すれば、決して書かれません。

私は接続が起こっていないことを検出し、実行時に何とか処理できるようにアプリケーションに通知する必要があります。

アプリが起動した後にDBがダウンすると、save()コールでエラーは発生しませんが、キューに入れられ、DBが戻ったときに書き込まれます。

DBがダウンしたときにイベントを取得し、キューに登録されているセーブの数を問い合わせるために、APIにフックしたいのは例外です。ある時点では、待ち行列に入れられたイベントがたくさんあるので、新しいイベントの作成をやめて、そのアプリケーションをオフに戻したいと思うかもしれません。

+0

mongoで安全な書き込みとgetLastError()について知っていますか? –

+0

はい、そしてmongooseの文書によると、スキーマのデフォルトモードは安全です – justinhj

答えて

10

ケース#1:dbがアプリの起動時にダウンしています。私が今修正しているこのユースケースを防ぐ小さなバグがあります。しかし、ここでは回避策は次のとおりです。

var db = mongoose.createConnection(); 
db.on('error', function (err) { 
    if (err) // couldn't connect 

    // hack the driver to allow re-opening after initial network error 
    db.db.close(); 

    // retry if desired 
    connect(); 
}); 

function connect() { 
    db.open('localhost', 'dbname'); 
} 

connect(); 

https://gist.github.com/2878607

醜いが、作業要旨。最初にmongoをシャットダウンしてから、この要点を実行してください。

接続に失敗したことに注目してください。

次に、mongoを起動し、キューに入れられたすべての挿入が完了し、コンソールにダンプされたことを確認します。 書き込みと検索が開始されます。

シャットダウンmongoは、挿入と検索が試みられているが、コールバックは実行されていないことに注意してください。

mongoを再起動します。キューに入れられたすべての挿入と検索が完了したことに注目してください。

+0

それは私のために働くもので、私が働く必要があったようです、ありがとう! – justinhj

+0

@aaronheckmann現在のmongoose 3.xまたは4.xの変更はありますか? –

4

dbがダウンしているときに、サーバーへのすべての要求がむしろ失敗する場合、ネイティブドライバは、ミドルウェアで感知できる再接続イベントを発行します。

この再接続イベントの罰金を動作し、放出する(ネイティブドライバ1.3.23をMongoDBの)

mongoose.connection.db.on('reconnect', function (ref) { 
    connected=true; 
    console.log('reconnect to mongo server.'); 
}); 

だから私ののDBConnectionミドルウェアは、イベントの (一部が重複しているが、害はありません。再接続/接続/エラーを探します!) PS。最初の接続障害は、上記の aaronheckmannの答えとして再試行することによって引き続き処理する必要があります。

mongoose.connection.on('open', function (ref) { 
    connected=true; 
    console.log('open connection to mongo server.'); 
}); 

mongoose.connection.on('connected', function (ref) { 
    connected=true; 
    console.log('connected to mongo server.'); 
}); 

mongoose.connection.on('disconnected', function (ref) { 
    connected=false; 
    console.log('disconnected from mongo server.'); 
}); 

mongoose.connection.on('close', function (ref) { 
    connected=false; 
    console.log('close connection to mongo server'); 
}); 

mongoose.connection.on('error', function (err) { 
    connected=false; 
    console.log('error connection to mongo server!'); 
    console.log(err); 
}); 

mongoose.connection.db.on('reconnect', function (ref) { 
    connected=true; 
    console.log('reconnect to mongo server.'); 
}); 
関連する問題