alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.77k stars 8.55k forks source link

开启keepalive后,过一段时间导致mysql 报 "too many connections"; #4688

Open huolianchiyun opened 2 years ago

huolianchiyun commented 2 years ago

问题:开启keepalive后 链接池不停的过一段时间关掉所有链接,然后重新创建链接,最终导致mysql 报 "too many connections"; 原因:DestroyTask#shrink(boolean checkTime, boolean keepAlive) 方法有bug, 链接空闲时间: long idleMillis = currentTimeMillis - connection.lastActiveTimeMillis; 但keepalive后并没有更新connection.lastActiveTimeMillis,导致 idleMillis 会超过 minEvictableIdleTimeMillis、maxEvictableIdleTimeMillis 从而将其加入清除数组evictConnections中 清除掉链接。 解决办法; keepalive 时 更新 connection.lastActiveTimeMillis image

wenshao commented 2 years ago

druid什么版本?

huolianchiyun commented 2 years ago

1.2.8

zrlw commented 2 years ago

保活不能更新connection.lastActiveTimeMillis,否则空闲连接超过minIdle自动回收机制将永久失效,因为修改lastActiveTimeMillis之后连接空闲时间idleMillis永远不会超过minEvictableIdleTimeMillis,这个之前有人提交过类似的PR又撤回了。

zrlw commented 2 years ago

这个问题应该和 #4692 是同一个问题。