当数据库连接池被打满的时候,经常可以看到这样的报错:
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的队列大小。
其余的请求肯定拿不到连接,只能往下走,然后抛异常。