0

我有一个使用 Express.js 的简单应用程序,可以处理来自远程系统的发布数据。

有基本身份验证 (express.basicAuth) 和一些其他模块(用于 DB 连接池的通用池、用于时间计算的 moment.js 和 mysql)以及 Forever 以将应用程序作为服务运行。该应用程序在 SuSe 11.2 上运行以防万一。

一切运行正常大约 2 小时 - 数据被发布、处理,然后存储。每个帖子大约 1kb~ 的数据,每小时 80 个帖子。之后,应用程序变得无响应,直到应用程序重新启动($ 永远重新启动)

我对 Node 很陌生,不知道下一步该去哪里调试问题。当应用程序无响应时,没有任何内容写入访问或错误日志文件,并且不确定是否有其他方法可以获得有意义的输出或堆栈跟踪。

任何建议或方向将不胜感激!

编辑:正如评论中添加的那样,数据被解析并使用通用池直接写入 MySQL 表以进行连接管理。

具体来说:

var poolModule = require('generic-pool');
var pool = poolModule.Pool({
    name: 'mysql',
    create: function(cb) {
        var mysql = require('mysql');
        var db = mysql.createConnection({ host: '...', user: '...', 'password: '...' });
        cb(null, db);
    },
    destroy: function(client) { client.end(); },
    max: 10
});

然后在路由器中:

function(req, res) {
    pool.acquire(function(err,client)) {
        if(err) throw err;

        // ...data parsing / query building


        client.query('...the query...', function(err, rows, fields) {
            pool.release(client);
            if(err) { res.send(err); }
            else { res.send('success'); }
        }
    });
}

Edit2 - 似乎发生了导致数据库连接未关闭的故障事件。我注意到 2 个连接打开了 5 分钟和 15 分钟。鉴于这种增长速度,很容易达到最大连接限制 (10) 并导致挂起。我很快就会知道这是不是罪魁祸首!:)

4

2 回答 2

4

遇到错误时未释放数据库连接。当最终达到连接限制时,后续的页面请求会挂起。在改进了数据处理和错误处理之后,问题就消失了。

于 2013-01-30T16:13:06.673 回答
0

尝试像下面这样维护您的数据库连接怎么样?

setInterval(function(){
    // Run query to retain db connection
    db.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
        if (err) throw err;
    });
}, 60 * 1000);
于 2013-05-31T04:46:16.760 回答