6
回答
druid连接泄露问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

@wenshao 你好,想跟你请教个问题:

最近我在用druid做项目时碰到一个问题,应用在访问一段时间后会出现数据连接不响应,应用无响应现象,必须重启才可以继续使用,通过查看监控平台看到“逻辑连接打开次数”和“逻辑连接关闭次数”是匹配的 可以过一段时间之后 就不匹配了 再过一段时间“池中连接数(27个)”比“池中连接数峰值(30个)”少(因为我初始化最小连接是30个,最小空闲连接也是30个最大是50个)然后也配置removeAbandoned=true,removeAbandonedTimeout=180,

logAbandoned=true这三个参数了 我发现连接数不匹配的时候也查看了StackTrace for active Connection这个 但是这个里面什么都没有,然后也按照官方的说法“在内置监控页面weburi-detail.html中,查看JdbcPoolConnectionOpenCount和JdbcPoolConnectionCloseCount属性,如果不相等,就是泄漏了。”一个一个查看url的打开链接次数(JdbcPoolConnectionOpenCount)和关闭连接次数(JdbcPoolConnectionCloseCount)都一样 但是为什么还有链接没有释放?removeAbandoned这个属性是不是表示的是我从连接池拿到一个连接没有返回到连接池里面在一定时间内强制回收是吗?

<无标签>
举报
MLGKO
发帖于3个月前 6回/101阅

可能不是 Druid 的问题,我也试过连接用完的情况,Web项目就陷入无限等待连接池了。

原因:可能是你的程序因为异常或者其他原因造成,没有释放被使用过的数据库连接。

引用来自“蓝水晶飞机”的评论

可能不是 Druid 的问题,我也试过连接用完的情况,Web项目就陷入无限等待连接池了。

原因:可能是你的程序因为异常或者其他原因造成,没有释放被使用过的数据库连接。

我测试过就算程序异常也是可以回收的。并且我把全部功能逐个点一边连接也都能正常的回收。还有要是没有回收的话我配置了removeAbandoned=true,removeAbandonedTimeout=180这两个参数,当连接3分钟没有返回连接池并且在活跃状态(我个人理解)应该会强制回收的,如果强制回收了我也配置了logAbandoned=true应该能从StackTrace for active Connection看到强制回收的log吧!但是现在点击进去是

{"ResultCode":1,"Content":[]}

url监控我全部点了一遍查看JdbcPoolConnectionOpenCount和JdbcPoolConnectionCloseCount的值都是相等的  但是为什么数据源的里面的逻辑连接打开次数和逻辑连接关闭次数不相等 

--- 共有 5 条评论 ---
MLGKO 回复 @蓝水晶飞机 : 对啊,强制回收不是长久之计,我观察druid的spring界面发现全部都是执行定时任务(spring的定时任务)的时候没有释放连接 3个月前 回复
MLGKO 回复 @蓝水晶飞机 : 对,物理打开次数刚开始是30 然后慢慢的增长 3个月前 回复
蓝水晶飞机你看看物理打开次数,应该会随着时间越来越大。 3个月前 回复
蓝水晶飞机我觉得通过Druid来释放泄露的连接,这虽然可以补救但不是根治的办法啊。 3个月前 回复
蓝水晶飞机我看了一下,我的系统这两个数字都是相等的(一直稳定),之前测试忘记释放连接这两个值就不等。你遇到的这个问题,你用的是什么框架呢?会不会出现重复取Connection,由于框架BUG,比如重复取Connection覆盖了ThreadLocal<Connection> 导致关闭连接的假象(我猜的,不清楚牛逼一点的框架有没其他实现方法)。 3个月前 回复

引用来自“漆黑的烈焰使”的评论

Druid 的监控怎么配置需要权限才能进入查看监控页面?现在大家都可以看

可以配置账号和密码和IP限制. 可以参考http://www.oschina.net/question/67067_88767?sort=time

连接池也必须关闭(入池),你肯定漏掉了

--- 共有 1 条评论 ---
MLGKO连接关闭不关闭应该是spring做的事情吧!我手动也关闭布料啊,我使用mybatis自动生成dao的实现类所以肯定手动关闭不了 3个月前 回复

引用来自“蓝水晶飞机”的评论

可能不是 Druid 的问题,我也试过连接用完的情况,Web项目就陷入无限等待连接池了。

原因:可能是你的程序因为异常或者其他原因造成,没有释放被使用过的数据库连接。

引用来自“MLGKO”的评论

我测试过就算程序异常也是可以回收的。并且我把全部功能逐个点一边连接也都能正常的回收。还有要是没有回收的话我配置了removeAbandoned=true,removeAbandonedTimeout=180这两个参数,当连接3分钟没有返回连接池并且在活跃状态(我个人理解)应该会强制回收的,如果强制回收了我也配置了logAbandoned=true应该能从StackTrace for active Connection看到强制回收的log吧!但是现在点击进去是

{"ResultCode":1,"Content":[]}

url监控我全部点了一遍查看JdbcPoolConnectionOpenCount和JdbcPoolConnectionCloseCount的值都是相等的  但是为什么数据源的里面的逻辑连接打开次数和逻辑连接关闭次数不相等 

我使用的是springMVC+MyBatis,然后是mybatis自动帮我生成dao实现类。我虽然是多数据源但是没有使用spring的AbstractRoutingDataSource +aop去切数据源。我是使用的注解。我的数据源配置如图

顶部