Nodejs BAE MongoDB 连接断开问题
Nodejs BAE MongoDB 连接断开问题
Hi各位,请教下这个问题,太头疼了 在BAE搭建的NodeJS项目,用mongoose连接BAE提供的MongoDB服务器,打印日志看了下每30秒就掉.网上查了下是BAE不支持长连接,一段时间没操作的话空闲连接就会关闭 试了N种方法:
- 写了个timer一直请求数据库,完全没用.timer设置为10S请求一次,但是数据库连接还是每30S报错一次. 2.捕捉connection的error事件, 在error事件触发的时候关闭再重新打开连接. 刚开始管用,运行一段时间站点就无法响应了.连上面的timer都不会执行了…
有谁也遇到过这个问题?有什么好的解决方案么?
Node.js BAE MongoDB 连接断开问题
背景
在使用百度应用引擎(BAE)部署的Node.js项目中,通过Mongoose连接到BAE提供的MongoDB服务器时,发现每隔30秒连接就会断开。经过调查发现,BAE平台不支持长连接,长时间没有操作会导致空闲连接被关闭。
已尝试的方法
-
定时器请求数据库
- 尝试通过定时器每10秒向数据库发送一次请求,期望保持连接不断开。
- 示例代码:
const mongoose = require('mongoose'); mongoose.connect('mongodb://your_connection_string', { useNewUrlParser: true, useUnifiedTopology: true }); setInterval(() => { mongoose.connection.db.admin().command({ ping: 1 }); }, 10000);
- 结果:虽然定时器可以定期发送请求,但连接仍然会在30秒后断开。
-
捕捉
connection
的error
事件- 捕捉到连接错误后,关闭当前连接并重新建立新的连接。
- 示例代码:
mongoose.connection.on('error', (err) => { console.error(`Database connection error: ${err.message}`); mongoose.disconnect(); mongoose.connect('mongodb://your_connection_string', { useNewUrlParser: true, useUnifiedTopology: true }); });
- 结果:这种方法起初有效,但运行一段时间后,整个站点变得无响应,甚至定时器也无法执行。
解决方案
考虑到BAE平台的限制,一个更可靠的解决方案是使用keepAlive
配置项来维持连接。keepAlive
可以让MongoDB客户端在连接断开时自动重连。
- 示例代码:
mongoose.connect('mongodb://your_connection_string', { useNewUrlParser: true, useUnifiedTopology: true, keepAlive: 30000, // 设置keepAlive时间为30秒 reconnectTries: Number.MAX_VALUE, // 无限重连 reconnectInterval: 500 // 重连间隔为500毫秒 }); mongoose.connection.on('error', (err) => { console.error(`Database connection error: ${err.message}`); }); mongoose.connection.on('disconnected', () => { console.log('Disconnected from database'); mongoose.connect('mongodb://your_connection_string', { useNewUrlParser: true, useUnifiedTopology: true, keepAlive: 30000, reconnectTries: Number.MAX_VALUE, reconnectInterval: 500 }); });
通过上述配置,即使连接断开,Mongoose也会自动尝试重新连接,从而避免频繁的手动干预。同时,通过设置reconnectTries
为Number.MAX_VALUE
,确保连接会无限次尝试重新连接,直到成功为止。
希望这个解决方案能帮助你解决连接断开的问题。如果还有其他问题或需要进一步的帮助,请随时留言交流!
bae确实有些坑。。租个服务器吧,也不贵,配置一般的话也就是[80,200]块钱一个月。。:)
参考这个吧:https://github.com/BaiduAppEngine/bae-nodejs-sdk 另外我建议你使用mongoskin,我自己就用的这个。它内部使用已经解决了这个问题。 另外要说一下,百度的文档更新速度,跟不上系统开发速度。 这是个瓶颈,毕竟写文档,总是要占用很多时间,期待bae的进一步完善。
试一下mongolab,www.bluemix.net 内部集成mongolab服务
在BAE(百度应用引擎)上使用Node.js连接MongoDB时遇到的连接断开问题确实比较常见,特别是由于BAE对空闲连接的限制。解决这个问题的一种有效方式是通过定时重连机制,确保在连接断开后能够及时恢复连接。下面是具体的一些策略和示例代码。
解决方案
-
使用
mongoose.connection.on('disconnected', ...)
监听器: 当连接断开时,可以监听到disconnected
事件,并在此事件中尝试重新连接。 -
使用
setInterval
进行定期检查: 定期检查连接状态,如果发现连接已断开,则尝试重新建立连接。
示例代码
const mongoose = require('mongoose');
mongoose.connect('mongodb://your-mongodb-connection-string', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// 监听连接断开事件
mongoose.connection.on('disconnected', () => {
console.log('Mongoose default connection disconnected');
// 尝试重新连接
mongoose.connect('mongodb://your-mongodb-connection-string', {
useNewUrlParser: true,
useUnifiedTopology: true
});
});
// 设置一个定时器来定期检查连接状态
setInterval(() => {
if (mongoose.connection.readyState === 0) { // 0 表示断开连接
console.log('Connection was closed, attempting to reconnect...');
mongoose.connect('mongodb://your-mongodb-connection-string', {
useNewUrlParser: true,
useUnifiedTopology: true
});
}
}, 10000); // 每10秒检查一次
console.log('Mongoose default connection open to', 'mongodb://your-mongodb-connection-string');
注意事项
- 确保使用最新的mongoose版本。
- 使用
useNewUrlParser
和useUnifiedTopology
以避免一些已知的兼容性问题。 - 连接字符串需要替换为你自己的MongoDB连接字符串。
通过这种方式,你可以有效地处理BAE上的连接断开问题,并保持你的应用正常运行。希望这能帮助到你!