美文网首页Java
一次 Druid 连接池泄露引发的血案

一次 Druid 连接池泄露引发的血案

作者: 愿天堂没有BUG | 来源:发表于2022-05-23 15:16 被阅读0次

    最近某个应用程序老是卡,需要重启才能解决问题,导致被各种投诉,排查问题是Druid 连接池泄露引发的血案。。

    异常日志如下:

    ERROR-com.alibaba.druid.pool.GetConnectionTimeoutException:waitmillis60000,active50,maxActive50,creating0atcom.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1512)atcom.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1255)atcom.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5007)atcom.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680)atcom.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5003)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1233)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90)

    连接池中的连接数量已经到达最大值了,到了 60 秒还不能创建连接就超时报错了。

    问题很明显,肯定是应用程序哪里用了连接但没有释放,全局排查代码又比较艰难,加了三个 Druid 连接池配置项,最终定位并解决了问题。

    添加以下配置:

    这就是连接泄露配置项,如果连接长时间不归还,removeAbandoned 打开状态,超过

    removeAbandonedTimeoutMillis 设置的超时时间,将会强制回收连接。

    连接池初始化时会启动一个线程,用于检查并回收连接。

    参考源码:

    com.alibaba.druid.pool.DruidDataSource#createAndStartDestroyThread

    当 logAbandoned 打开状态时,关闭连接同时会记录当时的堆栈日志,可用于定位到哪些代码打开了连接没关闭。

    abandonconnection,ownerthread:https-jsse-nio-4443-exec-9,connectedat: 1573521883837,openstackTraceatjava.lang.Thread.getStackTrace(Thread.java:1589)atcom.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1305)atcom.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4619)atcom.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680)atcom.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4615)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1217)atcom.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90)atorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:162)...

    这个配置项虽然可用于排查连接池释放问题,但生产环境小心使用,如果有的业务执行事务的时间比较长,会被误回收,小心引发另外一个血案。

    相关文章

      网友评论

        本文标题:一次 Druid 连接池泄露引发的血案

        本文链接:https://www.haomeiwen.com/subject/dovrprtx.html