Node.js + setInterval = 连接丢失:服务器关闭了连接

3

我有一个简单的Node.JS脚本(只是脚本,没有服务器),它应该每24小时做一件事情。但是大约8个小时后,我在错误日志中看到了这个:

Error: Connection lost: The server closed the connection.
    at Protocol.end (/home/user/dev/app/node_modules/mysql/lib/protocol/Protocol.js:73:13)
    at Socket.onend (stream.js:79:10)
    at Socket.EventEmitter.emit (events.js:117:20)
    at _stream_readable.js:910:16
    at process._tickCallback (node.js:415:13)
error: Forever detected script exited with code: 8
error: Forever restarting script for 1 time

我相信这很愚蠢,但解决起来应该很容易,只是我还没找到。有什么想法吗?


1
没有看到你的代码,很难确定。然而,错误提示表明与你的MySQL连接有关:也许 - 如果你一直保持连接打开状态 - 这是由于长时间不活动而断开连接了。 - Xophmeister
1
看起来连接是从另一侧关闭的。看到一些代码会很有帮助。 - freakish
我正在进行几个$.get请求和一些MySQL查询。代码马上就来。 - Nikolay Dyankov
1个回答

7

看起来你正在保持与远程MySQL服务器的开放连接。在8小时的空闲连接后,远程服务器将关闭连接。所以你有两个选择。要么发送一个keepalive请求,要么在初始请求后断开连接,然后在计时器启动下一个事件时再次打开连接。

Keepalive

如果你想发送一个keepalive请求,只需在间隔计时器上设置一个select 1

select 1只是一个简单的查询,它会导致MySQL返回一个结果1并重置MySQL服务器的连接超时。它可能看起来像这样。

function keepalive() {
  connection.query('select 1', [], function(err, result) {
    if(err) return console.log(err);
    // Successul keepalive
  });
}
setInterval(keepalive, 1000*60*5);

连接池

然而,最好使用mysql模块的连接池功能。它将按需连接到MySQL服务器,并会自动处理断开连接。


谢谢你的回答。有没有办法在不等待8个小时的情况下测试这个呢? :) - Nikolay Dyankov
1
您可以将MySQL服务器的超时值设置得更低。将连接超时值设置为15分钟并进行测试。 - Daniel
好的,我暂时接受你的答案,看起来我需要等待确认。 - Nikolay Dyankov
@NikolayDyankov执行select 1将返回1。 - ikrabbe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接