带有mysql的NodeJS服务器挂起
我写了一个使用NodeJS,Express,mysql的应用程序,到目前为止一切正常,但是当我的应用程序运行一段时间后,当mysql连接中断,我的应用程序通过这个exception,我的应用程序closures。
Error: read ECONNRESET at errnoException (net.js:901:11) at TCP.onread (net.js:556:19)
从另一个stackquestion我知道,我必须处理这样的未捕获的例外。
process.on('uncaughtException', function(err) { console.log('Caught exception: ' + err); console.log(err.stack); });
在此之后,我的应用程序不会退出,而是挂起,所以我的问题是如何处理这个exception,以便即使在这个exception和我的应用程序不挂断后,MySQL连接是好的。
我不确定你是否在为你的项目使用node-mysql模块,但是我和我遇到了同样的ECONNRESET问题。 以下是我对我的问题的回答:
我在他们的Github页面上联系了node-mysql人员,得到了一些肯定的答案。
-
MySQL确实会修剪空闲连接。 有一个MySQLvariables“wait_timeout”设置超时前的秒数,默认值是8小时。 我们可以将默认值设置得比这个大得多。 使用
show variables like 'wait_timeout';
查看您的超时设置并set wait_timeout=28800;
改变它。 -
根据这个问题 ,在这种断开连接之后,node-mysql不会修剪池连接。 模块开发人员build议使用心跳保持连接活动,如调用
SELECT 1;
间隔。 他们还build议使用节点池模块及其idleTimeoutMillis选项来自动修剪空闲连接。
我find了解决scheme,如果有其他人面临同样的问题,我发布这可能会帮助你们。
首先,我抓住了所有未捕获的exception,这使得我的应用程序不会exception退出。
第二个悬挂的问题是因为当服务器将closures连接,所有我请求的查询将失败,我的服务器会挂断我猜它的节点mysql错误,但我解决了它使用连接池,在池中如果服务器closures一秒钟之后再次获得连接,所以我的问题就这样解决了。
以下是如何最大限度地利用node-mysql池