connection holder is null 异常详解编程语言
文章转自:http://my.oschina.net/haogrgr/blog/224010 非常感谢原作者,思路非常清晰
今天在一台配置很低的机器上运行批量更新的程序~~~
大概跑了三十分钟~~~这配置~~~这程序~~~
然后华丽丽的报异常了~~~
具体异常是这样的,
132
) ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl
@4d4e22e1
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
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:
97
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
说什么holder为空
第一眼看到holder就像到Spring的源码, 里面到处是holder(笑)
但是这里的holder不是Spirng里面的,是Druid的
这个holder大概是用来hou住连接池里面的连接的.
然后为什么为空了呢? 目测是哪个链接坏了, 或者被意外的关闭了
根据异常调源码 at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:942)
942
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
看不出啥来. 只能将日志继续看看, 还是看不出啥来
然后看了上面代码几遍后, 老觉得 isRemoveAbandoned() 这个方法有鬼.
查看调用处,:
恩, 这个DestroyConnectionThread非常可疑, 跳
Iterator DruidPooledConnection iter = activeConnections.keySet().iterator();
long
timeMillis = (currrentNanos pooledConnection.getConnectedTimeNano()) / (
1000
*
1000
擦, 这里不对头, timeMillis = removeAbandonedTimeoutMillis timeMillis 这个是getConnection()被调用时的时间
意思就是一个连接被get后, 超过了 removeAbandonedTimeoutMillis这么久我就弄死你.
然后继续找removeAbandonedTimeoutMillis 这玩意在哪里设置的 ,最后发现是在
property name= removeAbandoned value= true /
property name= removeAbandonedTimeout value= 1800 /
初始化配置的这里设置的, 这两个参数的大概意思就是,
通过datasource.getConnontion() 取得的连接必须在removeAbandonedTimeout这么多秒内调用close(),要不我就弄死你.(就是conn不能超过指定的租期)
然后调成2个小时~~~
然后程序成功跑完~~~华丽丽的等了50分钟
总结:
连接池为了防止程序从池里取得连接后忘记归还的情况, 而提供了一些参数来设置一个租期, 使用这个可以在一定程度上防止连接泄漏
但是如果你的业务真要跑这么久~~~~那还是注意下这个设置.
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/13730.html
cjava相关文章
- Java基础学习笔记十八 异常处理详解编程语言
- Java ConcurrentModificationException异常原因和解决方法详解编程语言
- java通过Throwable的printStackTrace方法将异常信息保存到字符串中详解编程语言
- SpringBoot之异常捕获(N)详解编程语言
- 常见 Java 异常解释(恶搞版)详解编程语言
- 异常处理升级版详解编程语言
- [javaSE] 异常捕获详解编程语言
- InvocationTargetException异常解析详解编程语言
- Java异常详解编程语言
- Java异常处理详解编程语言
- java异常详解编程语言
- 异常详解编程语言
- Drools7.0.0.Final Unsupported major.minor version 52.0异常详解编程语言
- Java异常的中断和恢复详解编程语言
- fastJson反序列化异常,JSONException: expect ‘:’ at 0, actual =详解编程语言
- 自定义Exception异常详解编程语言
- 解析json异常Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $问题详解编程语言
- Spring事务异常回滚,捕获异常不抛出就不会回滚详解编程语言
- ForEach遍历ArrayList并删除其中元素时抛出异常:java.util.ConcurrentModificationException以及解决办法详解编程语言
- 异常:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException 分析几解决方案详解编程语言
- Python自定义异常类及用法