connection holder is null

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秒(视业务而定)

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值