1 连接被回收
(1)错误日志
Caused by: java.sql.SQLException: connection holder is
null
at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:
1085
)
at com.alibaba.druid.pool.DruidPooledConnection.getMetaData(DruidPooledConnection.java:
825
)
at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:
285
)
...
70
more
ERROR: (DruidDataSource.java:
1815
) abandon connection, open stackTrace
at java.lang.Thread.getStackTrace(Thread.java:
1588
)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:
942
)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:
4534
)
at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:
661
)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:
4530
)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:
880
)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:
872
)
(2)异常分析
由于connection holder is
null,所以在druid的源码中找有关连接的holder,在
com.alibaba.druid.pool包下有一个DruidConnectionHolder,源码如下图
通过源码结构可以判定DruidConnectionHolder是连接和事物的关联,holder中持有一个连接。数据库事物commit之前的所有操作都要基于同一个Connection,所以可以推断出holder is null 就是连接被释放了,
根据详细的异常堆信息 at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:
942
)查看源码
getConnectionDirect方法中有一段代码会回收Connection,如下图
决定是否回收Connection的条件是removeAbandoned, 然后把连接放到activeConnections中,然后在DruidConnectionHolder的init()方法中发现连接销毁线程
如上图 销毁连接的方法判断执行时间是否大于removeAbandonedTimeoutMillis,如果大于则销毁,然后发现项目中连接池参数设置配置了如下
<property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" value="60"/>
开启了removeAbandoned且设置了1分钟,由于项目中执行了一个盘点的worker,时长较长执行逻辑超过设置的阀值,连接被释放,触发上面的异常。
(3) 解决方案
removeAbandoned和removeAbandonedTimeout的设计初衷是为了防止连接泄露的情况发生,所以一定要配置
所以首先调长removeAbandonedTimeout时间,重新上线把中断的业务跑过,
然后优化对应的执行逻辑,缩减运行时间,最终把时长设定在180秒(视业务而定)
今天的文章connection holder is null分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/5985.html