14

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

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

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

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

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

如果数据库在应用程序启动时关闭,则实例上的任何 save() 调用都会静默失败,不会出现错误。如果数据库恢复,他们永远不会被写入。

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

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

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

4

2 回答 2

13

案例 #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,然后运行这个 gist。

注意连接失败。

然后启动 mongo 并查看所有排队的插入完成并转储到控制台。将开始写入和查找。

关闭 mongo,注意插入和查找正在尝试,但没有执行回调。

重启蒙哥。请注意,所有排队的插入和查找都已完成。

于 2012-06-05T22:45:05.227 回答
6

如果您宁愿在数据库关闭时对服务器的所有请求都失败,则本机驱动程序确实会发出重新连接事件,该事件可以在中间件中感知。

这可以正常工作并发出重新连接事件(mongodb native driver 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.');
});
于 2014-01-24T21:38:19.297 回答