处理来自 Node (Express) 的 MongoDB 连接问题
Handing MongoDB connection issues from Node (Express)
我有一个 Express 应用程序,它在启动时连接到 MongoDB 服务器并处理请求 on-demand(我没有断开连接 - 它是一个单线程服务器,所以没有池 - 相当简单的东西)
问题是 MongoDB 服务器可能会在一段时间内不可用(不是 on-site),虽然 Express App 没有崩溃,但似乎对服务器将 运行 不确定,直到连接恢复!
我想对此进行限制(例如,在一段时间后返回错误)但我似乎无法做到这一点...
我正在使用连接选项“{server: {auto_reconnect: true}}”这似乎确保一旦 MongoDB 服务器重新出现,请求完成(没有它,请求在停机时间似乎 运行 永远......) - 我无法访问客户端代码,所以我无法在那里修复它......
我假设 'connectTimeoutMS' 或 'socketTimeoutMS' 的组合允许我在 MongoDB 长时间不可用时终止请求,但我无法让这些工作(我试过将它们作为连接选项,在 URI 等中传递它们)
任何打开 Collection 和 Find/Insert/Update 的尝试都只是 'hangs' 直到 MongoDB 重新出现 - 我已经离开它超过 30 分钟,一切都只是坐着这些(并在网络恢复时完成AOK!)
最好的解决方法是什么?我应该专门为每个请求打开一个连接(不是真正的性能问题 - 它不是大容量应用程序)还是我还缺少其他东西?
已更新以添加连接代码
var myDB
var mongodb = require('mongodb')
var uri = // some env vars and stuff
mongodb.MongoClient.connect(uri, {server: {auto_reconnect: true}}, function (err, db) {
myDB = db
})
myDB 然后在其他地方使用来打开 collections - 并且来自它的句柄用于 find/insert 等
如果与数据库的连接中断,myDB.collection() 调用(或在其句柄上调用 find/insert)将简单地挂起,直到连接恢复——我没有尝试过让他们 'time out' 更快!?
我假设您正在使用 mongoose 作为驱动程序。
你会发现这个错误。
var db = require('domain').create();
db.on('error', function(err) {
console.log('DB got a problem');
});
db.run(function() {
mongoose.connect(config, options);
});
或者您可以直接访问
mongoose.connection.readyState
检查你的数据库的语句。
Connection ready state
0 = disconnected
1 = connected
2 = connecting
3 = disconnecting
Each state change emits its associated event name.
我有一个 Express 应用程序,它在启动时连接到 MongoDB 服务器并处理请求 on-demand(我没有断开连接 - 它是一个单线程服务器,所以没有池 - 相当简单的东西)
问题是 MongoDB 服务器可能会在一段时间内不可用(不是 on-site),虽然 Express App 没有崩溃,但似乎对服务器将 运行 不确定,直到连接恢复!
我想对此进行限制(例如,在一段时间后返回错误)但我似乎无法做到这一点...
我正在使用连接选项“{server: {auto_reconnect: true}}”这似乎确保一旦 MongoDB 服务器重新出现,请求完成(没有它,请求在停机时间似乎 运行 永远......) - 我无法访问客户端代码,所以我无法在那里修复它......
我假设 'connectTimeoutMS' 或 'socketTimeoutMS' 的组合允许我在 MongoDB 长时间不可用时终止请求,但我无法让这些工作(我试过将它们作为连接选项,在 URI 等中传递它们)
任何打开 Collection 和 Find/Insert/Update 的尝试都只是 'hangs' 直到 MongoDB 重新出现 - 我已经离开它超过 30 分钟,一切都只是坐着这些(并在网络恢复时完成AOK!)
最好的解决方法是什么?我应该专门为每个请求打开一个连接(不是真正的性能问题 - 它不是大容量应用程序)还是我还缺少其他东西?
已更新以添加连接代码
var myDB
var mongodb = require('mongodb')
var uri = // some env vars and stuff
mongodb.MongoClient.connect(uri, {server: {auto_reconnect: true}}, function (err, db) {
myDB = db
})
myDB 然后在其他地方使用来打开 collections - 并且来自它的句柄用于 find/insert 等
如果与数据库的连接中断,myDB.collection() 调用(或在其句柄上调用 find/insert)将简单地挂起,直到连接恢复——我没有尝试过让他们 'time out' 更快!?
我假设您正在使用 mongoose 作为驱动程序。
你会发现这个错误。
var db = require('domain').create();
db.on('error', function(err) {
console.log('DB got a problem');
});
db.run(function() {
mongoose.connect(config, options);
});
或者您可以直接访问
mongoose.connection.readyState
检查你的数据库的语句。
Connection ready state
0 = disconnected
1 = connected
2 = connecting
3 = disconnecting
Each state change emits its associated event name.