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

Druid连接池一个设置引发的血案

2016-01-15 11:27 549 查看
参考: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分钟

总结:

连接池为了防止程序从池里取得连接后忘记归还的情况, 而提供了一些参数来设置一个租期, 使用这个可以在一定程度上防止连接泄漏

但是如果你的业务真要跑这么久~~~~那还是注意下这个设置.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: