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”

是数据库连接都关闭了?


6 回复

根据您的描述,问题可能出在数据库连接池的管理上。在Node.js应用中,特别是在云平台上如百度应用引擎(BAE),数据库连接需要被妥善管理以避免资源耗尽或过早关闭。

分析

从您提供的代码来看,您已经在mongoose连接配置中设置了poolSize: 5,这表明您已经意识到需要管理数据库连接池。然而,问题仍然存在,可能是由于以下原因:

  1. 错误处理不当:尽管您已经添加了错误处理逻辑,但没有明确地重连机制。
  2. 连接池配置不恰当poolSize设置为5可能不足以支持您的应用负载。
  3. 环境变量配置问题:确保环境变量正确配置,并且与实际数据库连接信息一致。

解决方案

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(百度应用引擎)的环境可能会有一些限制或特性导致连接不能保持较长时间。

以下是一些可能的解决方案:

  1. 增加连接池大小: 你可以尝试增加server对象中的poolSize值,以允许更多的并发连接。

    var options = {
        db: { native_parser: false},
        server: { poolSize: 10 }, // 尝试增加到10
        user: '',
        pass: ''
    };
    
  2. 更稳定的错误处理: 确保你在捕获到错误时能够正确地重连,并且在重连时添加一些延迟,以避免短时间内频繁重连导致的问题。

    db.on('error', function (err) {
        logger.error("connect error :" + err);
        setTimeout(function() {
            db.open(host, database, port, options);
        }, 5000); // 延迟5秒再尝试重连
    });
    
  3. 检查数据库服务的配置: 确认BAE上的MongoDB服务是否支持长时间的连接,以及是否有任何超时限制。你可以联系BAE的客服确认这些细节。

  4. 使用持久连接: 如果可能,可以考虑使用一个持久连接库或者代理来管理数据库连接,这样可以更好地处理连接的生命周期。

通过上述方法,你应该能够解决在BAE上部署NodeClub时出现的“no open connections”的问题。如果问题依然存在,建议查看BAE的文档或者联系技术支持获取更多帮助。

回到顶部