После некоторых SQL-запросов система не может получить какое-либо соединение от HikariPool
и выводит следующее сообщение об ошибке
HikariPool-1 - Connection is not available, request timed out after 30002ms.
Протестировано с
- ХикариКП 3.3.1
- mysql-соединитель-java 5.1.47
- Java 8
1. Решение
1.1 Включите журналы отладки для com.zaxxer.hikari
, он распечатает много полезной информации.
2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - HikariPool-1 - configuration: 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - allowPoolSuspension.............false 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - autoCommit......................true 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - catalog.........................none 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - connectionInitSql...............none 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - connectionTestQuery.............none 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - connectionTimeout...............30000 //... 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - jdbcUrl.........................jdbc:mysql://192.168.1.4:3306/wordpress 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - leakDetectionThreshold..........0 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - maxLifetime.....................1800000 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - maximumPoolSize.................1 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - metricRegistry..................none 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - metricsTrackerFactory...........none 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - minimumIdle.....................1 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - password........................2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - poolName........................"HikariPool-1" 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - readOnly........................false 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - registerMbeans..................false 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - scheduledExecutor...............none 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - schema..........................none 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - threadFactory...................internal 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - transactionIsolation............default 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - username........................"mkyong" 2019-03-20 13:46:23 [main] DEBUG com.zaxxer.hikari.HikariConfig - validationTimeout...............5000 2019-03-20 13:47:25 [main] DEBUG com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Timeout failure stats (total=10, active=10, idle=0, waiting=0) 2019-03-20 13:47:25 [main] ERROR c.mkyong.calculator.StartApplication - [Exception] : HikariPool-1 - Connection is not available, request timed out after 30001ms.
1.2 По умолчанию/|время ожидания соединения равно
30 секунды.
HikariPool-1 - Connection is not available, request timed out after 30001ms.
1.3 Это означает, что пул Хикари достиг максимального количества подключений всего=10,
HikariPool-1 - Timeout failure stats (total=10, active=10, idle=0, waiting=0)
1.4 В основном это утечка соединения, обычно это вызвано тем, что соединение не закрыто после заимствования из пула.
Например, в приведенном ниже коде getConnection()
не закрыт, и это приведет к утечке соединения.
@Override public void update(int postId, String metaValue) throws SQLException { try (PreparedStatement ps = dataSource.getConnection().prepareStatement(SQL_UPDATE_POST_META)) { ps.setString(1, metaValue); ps.setInt(2, postId); ps.setString(3, GlobalUtils.META_KEY); ps.executeUpdate(); } catch (SQLException e) { logger.error("[UPDATE] [POST_ID] : {}, [META_VALUE] : {}", postId, metaValue); throw e; } }
Чтобы исправить это, просто закройте соединение.
@Override public void update(int postId, String metaValue) throws SQLException { try (Connection connection = dataSource.getConnection(); PreparedStatement ps = connection.prepareStatement(SQL_UPDATE_POST_META)) { ps.setString(1, metaValue); ps.setInt(2, postId); ps.setString(3, GlobalUtils.META_KEY); ps.executeUpdate(); } catch (SQLException e) { logger.error("[UPDATE] [POST_ID] : {}, [META_VALUE] : {}", postId, metaValue); throw e; } }
Рекомендации
Оригинал: “https://mkyong.com/jdbc/hikaripool-1-connection-is-not-available-request-timed-out-after-30002ms/”