Node.js应用程序在2小时后停止接收请求

时间:2013-01-29 21:20:13

标签: node.js express

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

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

一切都运行完美约2小时 - 数据被发布,处理,然后存储。每篇文章大约1kb~数据,每小时80个帖子。之后,应用程序将无响应,直到应用程序重新启动($ forever restart)

我是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)很容易达到并导致悬挂。 如果这是罪魁祸首,我很快就会知道! :)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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);