【发布时间】:2020-01-09 14:11:09
【问题描述】:
在过去的几天里,我遇到了一个问题,我的节点应用程序需要打开一个连接,以便在建立连接后立即崩溃。在我的应用程序运行了几个月后,这个问题突然出现了。我的虚拟机在这种情况开始发生之前就崩溃了,现在我无法停止连接丢失错误。我的应用程序和 mySQL DB 托管在同一台服务器上。
错误是:
{ Error: Connection lost: The server closed the connection.
at Protocol.end (/root/OTB/node_modules/mysql/lib/protocol/Protocol.js:112:13)
at Socket.<anonymous> (/root/OTB/node_modules/mysql/lib/Connection.js:97:28)
at Socket.<anonymous> (/root/OTB/node_modules/mysql/lib/Connection.js:525:1)
at emitNone (events.js:111:2)
at Socket.emit (events.js:28:7)
at endReadableNT (_stream_readable.js:164:12)
at _combinedTickCallback (internal/process/next_tick.js:139:11)
at process._tickCallback (internal/process/next_tick.js:181:9)
--------------------
at Protocol._enqueue (/root/OTB/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Protocol.handshake (/root/OTB/node_modules/mysql/lib/protocol/Protocol.js:51:23)
at Connection.connect (/root/OTB/node_modules/mysql/lib/Connection.js:119:18)
at Connection._implyConnect (/root/OTB/node_modules/mysql/lib/Connection.js:457:1)
at Connection.query (/root/OTB/node_modules/mysql/lib/Connection.js:199:8)
at Timeout.keepalive [as _onTimeout] (/root/OTB/appl.js:248:7)
at ontimeout (timers.js:498:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:29:5) fatal: true, code: 'PROTOCOL_CONNECTION_LOST' }
我已经在使用游泳池了。我尝试过断开连接并尝试重新连接,但它不起作用,因为它只是立即崩溃。我真的不知道发生了什么。我增加了 wait_timeout、interactive_timeout 和最大连接数。我尝试添加一个 keepalive 函数来保持连接打开,但正如我所提到的,连接会立即关闭。
非常感谢有关下一步尝试的一些指导,谢谢。
编辑: 游泳池很简单:
var pool = mysql.createPool({
host: "IP",
user: "USER",
password: "PASS",
database: "sys"
});
pool.getConnection(function(err, connection){
if(err){
console.log(err)
}
connection.query("SQLSTRING", function(err, result, fields) {
});
});
我也尝试过使用一些参数,例如
agent: false,
connector: "mysql",
connectTimeout : 60 * 60 * 1000,
aquireTimeout : 60 * 60 * 1000,
timeout : 60 * 60 * 1000,
pool: {maxConnections: 10000, maxIdleTime: 10000}
Edit2:附加信息
我可能发现我的代码有问题。我很可能没有真正正确地使用连接池。所以我有多个函数正在对我的数据库进行查询,创建连接的正确方法是什么?
我最初为每个正在创建的函数都有一个单独的池,我认为这是不正确的,但即使在函数之外有一个单独的池声明并且每个函数都调用pool.getConnection,它也不起作用。这是正确的方法吗?正如我之前提到的,这段代码已经运行了几个月没有问题。
【问题讨论】:
-
在崩溃发生之前有什么变化吗?
-
请提供您的脚本以便我们检查是否有问题,您是否尝试过重启 MySQL 服务?
-
我个人从未改变过任何东西。我已经尝试重新启动虚拟机、服务,一切。我用我的设置 Cedric 示例编辑了我的问题,这是基本的池设置。
-
服务器崩溃的原因也无关,我的服务器内存不足并崩溃。重新启动所有应用程序后,我注意到了这个问题。
-
会不会是某些 MySQL 表损坏了?
标签: javascript mysql node.js