报错信息:
Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:695)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:197)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:162)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
关于这个报错,在网上查都是说加最大连接数即可,但我一直不明白为什么,然后去自己看了下
问题定位:
从报错信息中可以看出,是在获取数据库连接时超时抛出的异常,如图
这个方法执行的前置条件如下
那么问题肯定处在拿连接的地方,进去看下实现
从这里可以看到,所谓的拿连接,其实是HikariCP里每个连接都有个标志位,当标志位为`STATE_NOT_IN_USE`未使用时,修改标志位为`STATE_IN_USE`使用中,修改成功时返回连接。
那么很明显了,为什么拿连接会超时,就是当前连接池中所有的连接的使用状态都为`STATE_IN_USE`使用中,且在等待时间(默认30秒)之内一直没有未使用的连接才会报。既然连接满了还无法满足需求,那么加大最大连接数即可。