记一次神通数据库的链接不释放问题
线上神通数据库, 其中有你多个微服务,其中一组微服务的连接池占满,项目报错:
com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 60, maxActive 60,creating 0, runningSqlCount 17
首先定位是否存在程序死锁的问题。
SELECT status,count(0) FROM V$SESSION group by status
状态=ACTIVE: 激活,(22条,当天创建的=1条)
状态=SNIPED:空闲待清理(2.2k+,当天创建=2.2k+)
大部分线程数据sniped激活状态数据比较少, 排除程序死锁的问题。
单个项目的pod都不行,其他项目的pod正常,排除框架的问题。我们使用的是orsn+druid+mybatisPlus。
如何定位单个项目的链接不释放, 查看代码,检索关键词connection。 发现没有手写的sql,唯一一个手写sql还是try包裹的自动释放,不存在链接不释放问题。
使用的druid 开启监控监控17个正在执行的慢sql是啥?
# 启用连接泄漏检测和回收(必须为 true) spring.datasource.druid.remove-abandoned=true # 设置连接被遗弃的超时时间(单位:秒),根据业务场景调整 spring.datasource.druid.remove-abandoned-timeout=180 # 在回收被遗弃的连接时输出错误日志(记录堆栈跟踪) spring.datasource.druid.log-abandoned=true
泄露点日志示例:
ERROR [com.alibaba.druid.pool.DruidDataSource] - abandon connection, open stackTraceat java.lang.Thread.getStackTrace(Thread.java:1567)