数据库的连接池的数量大于活跃中的线程数,即 size > busy, Unable to fetch a connection in 10 seconds

当数据库连接池被打满的时候,经常可以看到这样的报错:

Timeout: Pool empty. Unable to fetch a connection in 10 seconds, none available[size:100; busy:15; idle:0; lastwait:10000].



在这里,我们可能有个疑问,为什么size是100而busy是15,这不是说还有 100 - 15 = 85的空闲线程,但idel又是=0,这是因为获取连接池的时候,大量的并发,导致busy队列的数量没有及时更新,因此日志打印的还是之前的数量,但是实际上busy队列已经被塞满。

我们看下面代码,这是tomcat数据库连接池的借用连接池的方法。

假如之前busy阻塞队列的大小只有15,此时有一万并发进来,在代码  1  处,这10000并发只能有 100 - 15 = 85 个请求能拿到连接,能走到代码  2  里面去,在代码  2  里面增加busy的队列大小。

其余的请求肯定拿不到连接,只能往下走,然后抛异常。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值