【问题标题】:How to handle Mongoose DB connection interruptions如何处理 Mongoose DB 连接中断
【发布时间】:2014-01-25 06:20:54
【问题描述】:

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

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

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

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

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

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

因此,我需要检测到从未发生过连接,并让应用能够在运行时告知这一点,以便我能够以某种方式处理它。

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

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

【问题讨论】:

  • 你知道mongo中的安全写入和getLastError()吗?
  • 是的,根据 mongoose 文档,架构的默认模式是安全的

标签: node.js mongodb mongoose


【解决方案1】:

案例 #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,注意插入和查找正在尝试,但没有执行回调。

重启mongo。注意所有排队的插入和查找都已完成。

【讨论】:

  • 这对我有用,似乎是我需要的工作,谢谢!
【解决方案2】:

如果您宁愿在 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.');
});

【讨论】:

  • 我想说将connected=false 设置为错误可能不正确。似乎在某些情况下你得到一个错误而不是disconnected: > error: Emitted if an error发生在连接上,比如由于格式错误的数据或大于16MB的有效负载而导致的parseError。
猜你喜欢
  • 2013-12-21
  • 2013-10-16
  • 2015-05-01
  • 2016-02-25
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多