如何处理Mongoose DB连接中断

时间:2012-06-03 19:19:40

标签: node.js mongodb mongoose

我一直在评估Mongoose(一个使用MongoDB进行持久存储的node.js的ORM)。

我想要做的是确保应用程序可以在应用程序启动时数据库未启动时运行,并且还可以智能地处理数据库故障。

目前我的测试应用程序在两种情况下都不起作用:

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

然后我在制作模型时使用该连接。

如果数据库在应用程序启动时出现故障,那么对实例的任何save()调用都将以无错误的方式失败。如果数据库重新启动,则永远不会被写入。

所以我需要检测连接从未发生过,让应用程序能够在运行时告诉它,以便我能以某种方式处理它。

当应用程序启动后数据库发生故障时,虽然save()调用仍然不会导致错误,但它们会排队并在数据库恢复时写入。

这似乎很好,除了我想在数据库关闭时挂钩API以获取事件并查询排队的存储数量。在某些时候,我可能会有很多排队的事件,我想要停止制作新的事件并让应用程序退出。

2 个答案:

答案 0 :(得分:12)

案例#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。注意所有排队的插入和查找都已完成。

答案 1 :(得分:5)

如果您希望在db关闭时向服务器发出所有请求,本机驱动程序会发出重新连接事件,该事件可以在中间件中检测到。

这可以正常运行并发出重新连接事件(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.');
});