我正在使用NodeJS,Express,mysql编写应用程序,到目前为止一切正常,但是当我在mysql连接中断后运行我的应用程序时,我的应用程序通过此异常并且我的应用程序出现故障。
Error: read ECONNRESET
at errnoException (net.js:901:11)
at TCP.onread (net.js:556:19)
从另一个堆栈问题我开始知道我必须处理这样的未被捕获的异常。
process.on('uncaughtException', function(err) {
console.log('Caught exception: ' + err);
console.log(err.stack);
});
之后现在我的应用程序没有退出,而是它挂断了,所以我的问题是如何处理这个异常,以便即使在此异常之后mysql连接也没问题,我的应用程序也没有挂起。
答案 0 :(得分:2)
我不确定您是否正在为项目使用node-mysql模块,但我当时遇到了同样的ECONNRESET问题。这是我的回答的重复on my issue:
我联系了their Github page上的node-mysql人员并得到了一些确切的答案。
MySQL确实修剪了空闲连接。有一个MySQL变量" wait_timeout"设置超时前的秒数,默认为8小时。我们可以将默认值设置为远大于此值。使用show variables like 'wait_timeout';
查看超时设置,set wait_timeout=28800;
进行更改。
根据this issue,node-mysql在这些断开连接后不会修剪池连接。模块开发人员建议使用心跳来保持连接活动,例如在一个时间间隔内调用SELECT 1;
。他们还建议使用node-pool module及其idleTimeoutMillis选项自动修剪空闲连接。
答案 1 :(得分:2)
我找到了解决方案,如果其他人遇到同样的问题,我也会发帖,这也可能对你们有所帮助。
首先,我抓住了所有未被捕获的异常,这使得我的应用程序不会异常退出。
第二个悬挂的问题是因为当服务器关闭连接时,我所请求的所有查询都会失败,我的服务器只会挂断我猜它的node-mysql错误,但是我使用连接池解决了它,在池中如果服务器关闭连接,它会在一秒左右后重新获得,所以我的问题就这样解决了。
答案 2 :(得分:0)
在运行查询后需要手动关闭连接的同时运行多个查询时发生错误。我制作了一个小脚本来处理这个问题。 https://gist.github.com/mkhizeryounas/647aebf07f37aabd5cddce66c45dcb25
var mysql = require("mysql");
var keys = require('./keys');
var pool = mysql.createPool({
host : keys.mysql.host,
port : keys.mysql.port,
user : keys.mysql.user,
password : keys.mysql.password,
database : keys.mysql.database,
});
module.exports = {
getConnection (callback) {
pool.getConnection((err, conn) => {
if(err) {
return callback(err);
}
callback(err, conn);
});
},
query (query, params=[], cb) {
this.getConnection((err, conn) => {
conn.release();
if(err) return cb(err, null);
conn.query(query, params, (err, res) => {
if(err) return cb(err, null);
return cb(null, res);
});
});
}
}