我有一个简单的应用程序,使用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)很容易达到并导致悬挂。 如果这是罪魁祸首,我很快就会知道! :)
答案 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);