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

性能测试时,报错org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object,日志中最后的堆栈如下:
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1171)
at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79)

at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)

我们dbcp的配置

maxActive="30" maxIdle="10" maxWait="10000" removeAbandoned="true" removeAbandonedTimeout="30" testOnBorrow="true" testOnReturn="false" testWhileIdle="true"

查看GenericObjectPool代码

                            if(maxWait > 0 && ((System.currentTimeMillis() - starttime) >= maxWait)) {
                                synchronized(this) {
                                    // Make sure allocate hasn't already assigned an object
                                    // in a different thread or permitted a new object to be created
                                    if (latch.getPair() == null && !latch.mayCreate()) {
                                        // Remove latch from the allocation queue
                                        _allocationQueue.remove(latch);
                                    } else {
                                        break;
                                    }
                                }
                                throw new NoSuchElementException("Timeout waiting for idle object");

可以看到,在我们配置下,是等了超过10秒后,依然没获取到连接,报错,那这种报错有哪些可能呢?可参考这个,1.数据库关闭;2.并发量过高,申请的连接太多导致排队太长,这样总共有部分会等待超时(假设maxWait没配置,默认为500ms)

那我们的是什么问题呢?所有的配置都一样,别的都没问题,那一定是数据库响应太慢,atop查看数据库服务器,IO过高。

对这种错误怎么解决呢?

看需要的结果是什么,如果是普通情况都报错了,那最好是检查一下maxWait是否太短、并发是否太高、是否有过慢的sql导致连接一直无法归还入池;如果正常情况没问题,性能场景有问题,则需要看是否是数据库IO是否正常、是否有过慢sql,配合awr报告等解决;单纯的解决这个错误,可以尝试修改maxWait更长或者为0,等待无限长时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值