我在同一个虚拟网络中的Azure上有2台虚拟机。
一台虚拟机运行一个负责MySQL操作的NodeJs进程。
其他虚拟机运行MySQL实例。我可以从其他VM和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)"
}
}
答案 0 :(得分:0)
根据我的经验,有两种情况可能会引发您的问题。
连接到达MySQL服务器的max_connection号,并且新连接客户端没有可用的连接。在这种情况下,您可以检查您的代码,是否在MySQL操作后释放连接。
另一方面,当您收到超时异常时,您可以登录VM门户的监控页面中的Azure管理门户,以检查指标是否达到VM的瓶颈,这也将是您的问题。在这种情况下,您可以扩展VM以扩大VM硬件。
答案 1 :(得分:0)
Node.js mysql模块有一些options 其中一个选项是'connectTimeout',默认为10000ms(大约10秒)。
如果在这10秒内没有任何操作,连接将自动关闭。
解决问题的方法是使用pooling connections。
使用此功能,您可以创建连接池。每次需要执行查询时,它都会从池中获取连接使用它,当它到期时它会自动返回池,准备重新启动,因此不会再出现连接超时错误。
答案 2 :(得分:0)
我有一个进程一直在运行,当它闲置一段时间后,池中的连接处于休眠状态。最终MySQL根据my.cnf中的wait_timeout设置清除这些连接。一旦发生这种情况并且我尝试使用连接,它将失败,因为模块假定连接仍处于活动状态并尝试仅使用它来获取超时或连接异常。
为了防止这种情况,您可以覆盖mysql模块代码以支持"连接生命周期"在游泳池中或停止使用游泳池并管理自己的连接。