【问题标题】:Connection lost as soon as a connection is made - NodeJS/MYSQL建立连接后立即丢失连接 - NodeJS/MYSQL
【发布时间】: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


【解决方案1】:

尝试使用这两个选项,它可能会有所帮助。 1.

var connection;
    function connectDb() {
  connection  = mysql.createConnection({
    host: 'localhost',
    user: '--',
    database: '---',
    password: '----'
  });
  connection.on('error', connectDb()); // probably worth adding timeout / throttle / etc
}

2.

const pool = mysql.createPool({
  host: 'localhost',
  user: '--',
  database: '---',
  password: '----'
});

// ... later
pool.query('select 1 + 1', (err, rows) => { /* */ });

【讨论】:

  • 不幸的是,结果相同。谢谢你的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2020-05-15
  • 1970-01-01
  • 2016-11-10
  • 2016-02-23
  • 2023-04-04
  • 2020-09-21
相关资源
最近更新 更多