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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25026989/article/details/89459830

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

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的队列大小。

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

猜你喜欢

转载自blog.csdn.net/qq_25026989/article/details/89459830