您的位置:首页 > 产品设计 > UI/UE

get/close not same thread Druid 连接池一个设置没设置对引发的血案

2014-12-18 11:41 471 查看
我就郁闷了,1000W+数据审核每次总是到一半就出这么个错,仔细找找原来是一个配置项的小问题,removeAbandonedTimeout 这个代表你从连接池取出一个连接多少秒之后你还没还回来,那就强制取回,所以就报这个错.

相关文章地址: http://my.oschina.net/haogrgr/blog/224010
今天在一台配置很低的机器上运行批量更新的程序~~~ 大概跑了三十分钟~~~这配置~~~这程序~~~ 然后华丽丽的报异常了~~~ 具体异常是这样的,
?
这个是最初的异常, 后面还有一大批异常,?
说什么holder为空 第一眼看到holder就像到Spring的源码, 里面到处是holder(笑) 但是这里的holder不是Spirng里面的,是Druid的 这个holder大概是用来hou住连接池里面的连接的. 然后为什么为空了呢? 目测是哪个链接坏了, 或者被意外的关闭了... 根据异常调源码 at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:942)?
看不出啥来. 只能将日志继续看看, 还是看不出啥来 然后看了上面代码几遍后, 老觉得 isRemoveAbandoned() 这个方法有鬼. 查看调用处,:

恩, 这个DestroyConnectionThread非常可疑, 跳?
继续?
擦, 这里不对头, timeMillis >= removeAbandonedTimeoutMillis timeMillis 这个是getConnection()被调用时的时间 意思就是一个连接被get后, 超过了 removeAbandonedTimeoutMillis这么久我就弄死你. 然后继续找removeAbandonedTimeoutMillis 这玩意在哪里设置的 ,最后发现是在 <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="1800" /> 初始化配置的这里设置的, 这两个参数的大概意思就是, 通过datasource.getConnontion() 取得的连接必须在removeAbandonedTimeout这么多秒内调用close(),要不我就弄死你.(就是conn不能超过指定的租期)
然后调成2个小时~~~ 然后程序成功跑完~~~华丽丽的等了50分钟 总结: 连接池为了防止程序从池里取得连接后忘记归还的情况, 而提供了一些参数来设置一个租期, 使用这个可以在一定程度上防止连接泄漏 但是如果你的业务真要跑这么久~~~~那还是注意下这个设置.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  异常