Azure 上的 MySql 抛出池连接超时错误

Azure 上的 MySql 抛出池连接超时错误

我在同一个虚拟网络中的 Azure 上有 2 台虚拟机。

一个虚拟机运行一个NodeJs进程,负责MySQL操作。

其他虚拟机运行 MySQL 实例。我可以从其他虚拟机和 NodeJs 进程正常连接到它。

有时从池中获取连接时会失败并抛出有关连接超时的错误。

我的连接字符串使用虚拟网络内的本地 IP 地址来访问数据库,因此它应该有这么大的延迟,超过 10 秒的超时。当它工作时,它很快,我的意思是真的很快!但有时它会突然中断并随机再次开始工作。有人遇到过这种情况吗?

如果有任何帮助,这是一个基于 Ubuntu Server 15.10 的 MySQL 实例。

例外:

{
  "error": {
    "name": "Error",
    "status": 500,
    "message": "connect ETIMEDOUT",
    "errorno": "ETIMEDOUT",
    "code": "ETIMEDOUT",
    "syscall": "connect",
    "fatal": true,
    "stack": "Error: connect ETIMEDOUT
            at PoolConnection.Connection._handleConnectTimeout (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/Connection.js:375:13)
            at Socket.g (events.js:180:16)
            at Socket.EventEmitter.emit (events.js:92:17)
            at Socket._onTimeout (net.js:327:8)
            at Timer.unrefTimeout [as ontimeout] (timers.js:412:13)
            --------------------
            at Protocol._enqueue (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/protocol/Protocol.js:135:48)
            at Protocol.handshake (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/protocol/Protocol.js:52:41)
            at PoolConnection.connect (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/Connection.js:123:18)
            at Pool.getConnection (projectdir/node_modules/loopback-connector-mysql/node_modules/mysql/lib/Pool.js:45:23)
            at MySQL.executeSQL (projectdir/node_modules/loopback-connector-mysql/lib/mysql.js:200:12)
            at projectdir/node_modules/loopback-connector-mysql/node_modules/loopback-connector/lib/sql.js:408:10
            at projectdir/node_modules/loopback-datasource-juggler/lib/observer.js:175:9
            at doNotify (projectdir/node_modules/loopback-datasource-juggler/lib/observer.js:93:49)
            at MySQL.ObserverMixin._notifyBaseObservers (projectdir/node_modules/loopback-datasource-juggler/lib/observer.js:116:5)
            at MySQL.ObserverMixin.notifyObserversOf (projectdir/node_modules/loopback-datasource-juggler/lib/observer.js:91:8)"
  }
}

答案1

我有一个进程一直在运行,当它空闲一段时间时,池中的连接处于休眠状态。最终,MySQL 会根据 my.cnf 中的 wait_timeout 设置清除这些连接。一旦发生这种情况,我尝试使用连接,它将失败,因为模块假定连接仍然有效,并尝试使用它只是为了获得超时或连接异常。

为了防止这种情况,您可以覆盖 mysql 模块代码以支持池中的“连接寿命”,或者停止使用池并管理您自己的连接。

相关内容