Nodejs BAE上部署NodeClub 开始可以运行,之后访问显示“no open connections”
Nodejs BAE上部署NodeClub 开始可以运行,之后访问显示“no open connections”
连接数据库采用的下面的代码 修改Models/index的 连接代码
var mongoose = require('mongoose');
var db = exports.Db = mongoose.createConnection();
var options = {
db: { native_parser: false}, //bae提示设置成false才能运行
server: { poolSize: 5 },
user: '',
pass: ''
}
var isDev = false;
var host = isDev ? 'localhost' : 'mongo.duapp.com';
var port = isDev ? '27017' : '8908';
var database = isDev ? 'foo' : 'bae mongdb database';
var user = isDev ? 'foo' : 'bae api key';
var pass = isDev ? 'bar' : 'bae api secret';
db.open(host, database, port, options);
db.on('error', function (err) {
//logger.error("connect error :" + err);
//监听BAE mongodb异常后关闭闲置连接
db.close();
});
//监听db close event并重新连接
db.on('close', function () {
logger.info("connect close retry connect ");
db.open(host, database, port, options);
});
修改app.js mongoStore
app.use(session({
secret: config.session_secret,
key: 'sid',
store: new MongoStore({
db: "xPHzywbdmuggRjmPKD",
host: 'mongo.duapp.com',
port: 8908,
username:'hKi429544=hlR8xFLyQW',
password:'H44Ud8zZ8gr==mPMIMUQeHgI'
}),
resave: true,
saveUninitialized: true
}));
修改完成上传Bae可以运行,之后不超过一分钟显示“no open connections”
是数据库连接都关闭了?
根据您的描述,问题可能出在数据库连接池的管理上。在Node.js应用中,特别是在云平台上如百度应用引擎(BAE),数据库连接需要被妥善管理以避免资源耗尽或过早关闭。
分析
从您提供的代码来看,您已经在mongoose
连接配置中设置了poolSize: 5
,这表明您已经意识到需要管理数据库连接池。然而,问题仍然存在,可能是由于以下原因:
- 错误处理不当:尽管您已经添加了错误处理逻辑,但没有明确地重连机制。
- 连接池配置不恰当:
poolSize
设置为5可能不足以支持您的应用负载。 - 环境变量配置问题:确保环境变量正确配置,并且与实际数据库连接信息一致。
解决方案
1. 增强错误处理和自动重连机制
您可以改进错误处理逻辑,确保在遇到错误时能够更有效地重连。
db.on('error', function (err) {
console.error("Database connection error:", err);
// 重连逻辑
setTimeout(function() {
console.log("Reconnecting to the database...");
db.open(host, database, port, options);
}, 5000); // 等待5秒后尝试重连
});
2. 调整连接池大小
增加poolSize
以支持更多的并发连接。例如,将poolSize
调整为10或更高。
var options = {
db: { native_parser: false},
server: { poolSize: 10 }, // 增加连接池大小
user: '',
pass: ''
}
3. 确保环境变量正确配置
确保host
, database
, port
, username
, 和 password
等变量正确配置,并且与您的BAE环境中的实际值匹配。
示例代码
var mongoose = require('mongoose');
var db = exports.Db = mongoose.createConnection();
var options = {
db: { native_parser: false},
server: { poolSize: 10 }, // 增加连接池大小
user: '',
pass: ''
};
var isDev = false;
var host = isDev ? 'localhost' : 'mongo.duapp.com';
var port = isDev ? '27017' : '8908';
var database = isDev ? 'foo' : 'bae_mongodb_database';
var user = isDev ? 'foo' : 'bae_api_key';
var pass = isDev ? 'bar' : 'bae_api_secret';
db.open(host, database, port, options);
db.on('error', function (err) {
console.error("Database connection error:", err);
setTimeout(function() {
console.log("Reconnecting to the database...");
db.open(host, database, port, options);
}, 5000);
});
db.on('close', function () {
console.log("Database connection closed. Retrying...");
db.open(host, database, port, options);
});
通过这些改进,您的Node.js应用应该能够在BAE上更好地管理和保持与MongoDB数据库的连接。
不懂这里有没有 bae 的同学。
查看下历史日志?
文档中有说过不支持长连接,不知道是否有关,不过我也有过连接不上的情况,可能是不稳定
赶脚BAE不好用,ssh都没法连的
根据你的描述,问题可能出现在连接池的配置或者MongoDB服务的连接管理上。BAE(百度应用引擎)的环境可能会有一些限制或特性导致连接不能保持较长时间。
以下是一些可能的解决方案:
-
增加连接池大小: 你可以尝试增加
server
对象中的poolSize
值,以允许更多的并发连接。var options = { db: { native_parser: false}, server: { poolSize: 10 }, // 尝试增加到10 user: '', pass: '' };
-
更稳定的错误处理: 确保你在捕获到错误时能够正确地重连,并且在重连时添加一些延迟,以避免短时间内频繁重连导致的问题。
db.on('error', function (err) { logger.error("connect error :" + err); setTimeout(function() { db.open(host, database, port, options); }, 5000); // 延迟5秒再尝试重连 });
-
检查数据库服务的配置: 确认BAE上的MongoDB服务是否支持长时间的连接,以及是否有任何超时限制。你可以联系BAE的客服确认这些细节。
-
使用持久连接: 如果可能,可以考虑使用一个持久连接库或者代理来管理数据库连接,这样可以更好地处理连接的生命周期。
通过上述方法,你应该能够解决在BAE上部署NodeClub时出现的“no open connections”的问题。如果问题依然存在,建议查看BAE的文档或者联系技术支持获取更多帮助。