带有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人员,得到了一些肯定的答案。

  1. MySQL确实会修剪空闲连接。 有一个MySQLvariables“wait_timeout”设置超时前的秒数,默认值是8小时。 我们可以将默认值设置得比这个大得多。 使用show variables like 'wait_timeout'; 查看您的超时设置并set wait_timeout=28800; 改变它。

  2. 根据这个问题 ,在这种断开连接之后,node-mysql不会修剪池连接。 模块开发人员build议使用心跳保持连接活动,如调用SELECT 1; 间隔。 他们还build议使用节点池模块及其idleTimeoutMillis选项来自动修剪空闲连接。

我find了解决scheme,如果有其他人面临同样的问题,我发布这可能会帮助你们。

首先,我抓住了所有未捕获的exception,这使得我的应用程序不会exception退出。

第二个悬挂的问题是因为当服务器将closures连接,所有我请求的查询将失败,我的服务器会挂断我猜它的节点mysql错误,但我解决了它使用连接池,在池中如果服务器closures一秒钟之后再次获得连接,所以我的问题就这样解决了。

以下是如何最大限度地利用node-mysql池