Hikari CP JDBCConnectionException:无法打开连接

时间:2017-11-15 10:21:40

标签: java mysql hibernate tomcat hikaricp

环境

HikariCP version     : 2.4.2 
JDK version          : 1.7.0_141 
Database             : MySQL
MySQL Driver version : 5.6.27 
Hibernate            : 4.3.4

我们已经成功地从C3PO迁移了Hikari,直到最近我们遇到以下异常时,一切运行顺利。

  

org.hibernate.exception.JDBCConnectionException:无法打开   连接引起:java.sql.SQLTransientConnectionException:   HikariPool-0 - 连接不可用,请求超时后   30006ms。

我们在AWS EC2中部署我们的webapp,数据库托管在RDS中。 我们已经在4个tomcats上部署了Web应用程序。每个tomcat Web应用程序配置最大连接池大小为250。 在大约2小时内总共发生了4000次登录。

用例如下

我们已安排学生用户在一段时间内(例如上午9:00至下午12:30)进行在线测试。有同时登录(比如4000登录)

我们可以使用Locust重现此问题。我们启用log4j进行日志记录。以下是日志

DEBUG [http-apr-8080-exec-4] - HikariPool-0 - configuration:
DEBUG [http-apr-8080-exec-4] - allowPoolSuspension.............false *
DEBUG [http-apr-8080-exec-4] - autoCommit......................true *
DEBUG [http-apr-8080-exec-4] - catalog.........................
DEBUG [http-apr-8080-exec-4] - connectionInitSql...............
DEBUG [http-apr-8080-exec-4] - connectionTestQuery.............
DEBUG [http-apr-8080-exec-4] - connectionTimeout...............30000 *
DEBUG [http-apr-8080-exec-4] - dataSource......................
DEBUG [http-apr-8080-exec-4] - dataSourceClassName.............
DEBUG [http-apr-8080-exec-4] - dataSourceJNDI..................
DEBUG [http-apr-8080-exec-4] - dataSourceProperties............{useUnicode=true, password=, prepStmtCacheSqlLimit=2048, characterEncoding=utf8, cachePrepStmts=true, useServerPrepStmts=true, prepStmtCacheSize=250}
DEBUG [http-apr-8080-exec-4] - driverClassName.................
DEBUG [http-apr-8080-exec-4] - healthCheckProperties...........{}
DEBUG [http-apr-8080-exec-4] - healthCheckRegistry.............
DEBUG [http-apr-8080-exec-4] - idleTimeout.....................600000 *
DEBUG [http-apr-8080-exec-4] - initializationFailFast..........true *
DEBUG [http-apr-8080-exec-4] - isolateInternalQueries..........false *
DEBUG [http-apr-8080-exec-4] - jdbc4ConnectionTest.............false *
DEBUG [http-apr-8080-exec-4] - jdbcUrl.........................jdbc:mysql://rds url
DEBUG [http-apr-8080-exec-4] - leakDetectionThreshold..........0 *
DEBUG [http-apr-8080-exec-4] - maxLifetime.....................1800000 *
DEBUG [http-apr-8080-exec-4] - maximumPoolSize.................250
DEBUG [http-apr-8080-exec-4] - metricRegistry..................
DEBUG [http-apr-8080-exec-4] - metricsTrackerFactory...........
DEBUG [http-apr-8080-exec-4] - minimumIdle.....................5
DEBUG [http-apr-8080-exec-4] - password........................
DEBUG [http-apr-8080-exec-4] - poolName........................HikariPool-0
DEBUG [http-apr-8080-exec-4] - readOnly........................false *
DEBUG [http-apr-8080-exec-4] - registerMbeans..................false *
DEBUG [http-apr-8080-exec-4] - scheduledExecutorService........
DEBUG [http-apr-8080-exec-4] - threadFactory...................
DEBUG [http-apr-8080-exec-4] - transactionIsolation............
DEBUG [http-apr-8080-exec-4] - username........................username
DEBUG [http-apr-8080-exec-4] - validationTimeout...............5000 *

标记为*的默认值很少,而其他值则明确设置。

HikariConfig    config = new HikariConfig();
            config.setJdbcUrl(JDBC URL);
            config.setUsername(USER_NAME);
            config.setPassword(PASSWOrD);
            config.setMinimumIdle(5);
            config.setMaximumPoolSize(250);
            config.addDataSourceProperty("cachePrepStmts", true);
            config.addDataSourceProperty("prepStmtCacheSize", 250);
            config.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
            config.addDataSourceProperty("useServerPrepStmts", true);
                datasource = new HikariDataSource(config)

在20秒左右的时间内,连接池已用尽

  

DEBUG [http-apr-8080-exec-494] - 超时故障池HikariPool-0   统计

(总计= 100,活跃= 100,空闲= 0,等待= 194) 等待数量正在增加,最后提到前面提到的异常。

我们无法确定导致问题的原因。我们尝试了配置的变体,但还无法解决。

0 个答案:

没有答案