报错
Cause: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 5095, active 19, maxActive 200
Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 6991, active 27, maxActive 200, creating 0
at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1894) ~[druid-1.2.23.jar:?]
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1502) ~[druid-1.2.23.jar:?]
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5074) ~[druid-1.2.23.jar:?]
原因
使用的公平锁,严格按请求线程顺序排队,可能导致获取数据库连接超时
useUnfairLock=false
解决方法
useUnfairLock=true
为什么没有创建新的连接?
明明没有达到最大值,为什么没有创建新的连接?
不是一定立即创建新的连接,因为可能一下子创建太多的连接,比如一下子1000个请求,一下子创建1000个连接,这样可能就会有问题——所以实际情况是根据情况来决定是否创建新的连接还是说继续等待其他已有的连接释放
然后,有可能等着等着就超时了,报错这个错误
所以可能没有到最大连接数量,仍然报错:获取连接超时
默认值
默认值其实是非公平锁
但是如果配置了最大等待时间,默认值是公平锁
maxWait | -1 | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 | public void com.alibaba.druid.pool.DruidAbstractDataSource.setMaxWait(long) |
| ------- | -- | ------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------