MySQL报idle错误_Mysql Cannot get a connection, pool error Timeout waiting for idle object

问题

Cannot get a connection, pool error Timeout waiting for idle object

5eb40c13bdbf8400a08cd18ad6bf1841.png

原因

db.properties中配置的maxWait为连接池获取mysql连接最大等待时间,超过了这个时间仍然没获取到就会报这个错。

1b01f86e9a12c7bbcbfa0a800e991fad.png

深入分析一下为啥会获取不到Mysql连接,手动用来浏览器请求发送,发现当连接达到MaxActive时会获取不到,而剩下的50个都在Sleep状态,原来是用完后没有回收导致的。

88ce03f3d473b6f1cc572bad1138d1fd.png

原因1

应用程序没有很好的关闭使用后的连接

方案1:

请检查自己的应用程序是否正确关闭了数据库连接,注意一定要放到finally中关闭。(不推荐,让数据库连接池去管理连接)

方案2:

如果确实无法排查出具体哪些代码没有关闭数据库连接,可以通过配置参数完成自动回收,并记录回收日志,以便于定位问题代码;tomcat中连接池的配置自动回收参数为:removeAbandoned、 removeAbandonedTimeout、logAbandoned三个。(推荐)

#验证使用的SQL语句

validationQuery SELECT 1

#池中的连接空闲30分钟后被回收

minEvictableIdleTimeMillis 18000

#每30秒运行一次空闲连接回收器

timeBetweenEvictionRunsMillis 10000

#借出连接时不要测试,否则很影响性能

testOnBorrow false

testWhileIdle true#程序中的连接不使用后是否被连接池回收

#DBCP 2.0.1 (该版本要使用removeAbandonedOnMaintenance和removeAbandonedOnBorrow)

#removeAbandoned=true

removeAbandonedOnMaintenance=true

removeAbandonedOnBorrow=true#数据库连接过多长时间不用将被视为被遗弃而收回连接池中(单位秒)。(为配合测试程序才配置为30秒)

removeAbandonedTimeout=30

mysql等待时间要设为8小时,连接全部交给连接池管理。

原因2

应用压力过大,确实无法获取空闲连接

方案1:

这种情况可以调整maxActive、maxIdle、maxWait等连接池的容量和超时限制等参数以获取更大的连接池容量和等待时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值