Open huolianchiyun opened 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
druid什么版本?
1.2.8
保活不能更新connection.lastActiveTimeMillis,否则空闲连接超过minIdle自动回收机制将永久失效,因为修改lastActiveTimeMillis之后连接空闲时间idleMillis永远不会超过minEvictableIdleTimeMillis,这个之前有人提交过类似的PR又撤回了。
这个问题应该和 #4692 是同一个问题。
问题:开启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](https://user-images.githubusercontent.com/21038791/154612540-1c5ed3cf-bf45-4425-b641-d141e887452a.png)