2012-06-03 113 views
9

我一直在評估Mongoose(一個ORM for node.js,它使用MongoDB作爲持久存儲)。如何處理Mongoose DB連接中斷

我想要做的是確保應用程序啓動時數據庫未啓動時應用程序可以運行,並且還可以智能地處理數據庫。

目前我的測試應用程序,它不會在任何情況下工作,做到這一點:

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

然後我製作模型時,使用該連接。

在應用程序啓動時數據庫處於關閉狀態的情況下,對實例的任何save()調用將自動失敗並且沒有錯誤。如果數據庫恢復正常,他們永遠不會被寫入。

所以我需要檢測連接從未發生過,並讓應用程序能夠在運行時告訴我可以以某種方式處理它。

當應用程序啓動後數據庫出現故障時,儘管save()調用仍然不會導致錯誤,但它們在DB返回時排隊並寫入。

這似乎很好,除了我想鉤入API來獲取數據庫關閉時的事件並查詢有多少存儲隊列正在排隊。在某些時候,我可能會有很多排隊的事件,我想停止製作新的應用程序並讓應用程序退出。

+0

你知道mongo中的安全寫入和getLastError()嗎? –

+0

是的,根據貓鼬文檔,模式的默認模式是安全的 – 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當前貓鼬3.x或4.x有什麼變化? –

4

如果您在數據庫關閉時寧願讓所有對服務器的請求失敗,本地驅動程序確實會發出可以在中間件中感應到的重新連接事件。

這工作併發出重新連接事件罰款(MongoDB的本地驅動程序1.3.23)

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.'); 
});