egg icon indicating copy to clipboard operation
egg copied to clipboard

egg-mysql超过空闲时间之后断开连接的问题

Open MD-luffy opened this issue 5 years ago • 4 comments

一段时间不操作数据库之后,再进行操作,比如执行await app.mysql.query(..)时就要很久才能返回(很多时候对于前端来说就超时直接返回接口调用失败了),目测是长时间没操作数据库连接断开了,在egg-mysql文档里面没看到有检测连接状态和重连的方法,不知道大家是怎么处理这种情况的呢 ?

MD-luffy avatar Aug 05 '20 09:08 MD-luffy

理论上应该不是连接断开了。 egg-mysql 底层使用的是 ali-sdk 这个库, ali-sdk 使用的是 mysql 连接池 建立的连接。 可以打断点再排查一下是否是其他的原因

jjeejj avatar Aug 06 '20 01:08 jjeejj

我碰到过这个问题 是mysqljs/mysql这个库维护的连接池没有超时销毁的问题,好像是服务端的mysql连接有一个8小时的强制销毁机制啥的,不会通知到客户端断开,所以客户端的连接池的连接会一直存在, 可以看看这个PRAdd idleConnectionTimeout to pool options。 我的临时做法是开定时任务select 1让连接保活

bolin-L avatar Aug 07 '20 02:08 bolin-L

我碰到过这个问题 是mysqljs/mysql这个库维护的连接池没有超时销毁的问题,好像是服务端的mysql连接有一个8小时的强制销毁机制啥的,不会通知到客户端断开,所以客户端的连接池的连接会一直存在, 可以看看这个PRAdd idleConnectionTimeout to pool options。 我的临时做法是开定时任务select 1让连接保活

MySQL 本身是有个 等待超时的参数 wait_timeout 默认是 8小时,这时候使用 select 1 保活是很好的处理方案。 但是如果连接被销毁,在用这个连接执行 SQL 是会报错的。 还有题主的一段时间是多久? 应该没有8小时的

jjeejj avatar Aug 07 '20 07:08 jjeejj

@jjeejj 我后来也是采用 @bolin-L 开定时任务的方法来处理了

MD-luffy avatar Aug 18 '20 12:08 MD-luffy