我在同一虚拟networking上有两台Azure虚拟机。
一个虚拟机运行一个负责MySQL操作的NodeJs进程。
其他虚拟机运行一个MySQL实例。 我可以从另一个虚拟机和NodeJs进程连接到它。
有时它会失败,并从池中获取连接时出现关于连接超时的错误。
我的连接string使用虚拟networking内的本地IP地址访问数据库,所以它应该有这么多的延迟超过10秒的超时。 当它工作的时候很快,我的意思是非常快! 但是有时它只是rest,随机开始工作。 有人遇到过这个?
如果有任何帮助,这是一个基于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)" } }
我有一个进程一直运行,当它闲置一段时间池中的连接处于睡眠状态。 最后,MySQL根据my.cnf中的wait_timeout设置清除这些连接。 一旦发生这种情况,我尝试使用一个连接,它会失败,因为该模块假定连接仍然活着,并试图使用它只是为了获得超时或连接exception。
为了防止这种情况,您可以覆盖mysql模块代码来支持池中的“连接生存期”,或者停止使用池并pipe理自己的连接。