添加某些 @Test 方法时出现 HikariPool PoolInitializationException

HikariPool PoolInitializationException when some @Test method is added

我正在使用 HikariCP 2.6.1

我正在与 MySQLJUnit 4.x 一起安静地工作。就在今天,我添加了一个新的 @Test 方法,现在测试失败了。如果我把 @Ignore 放到这个新的 @Test 中,当然一切都会重新开始。如果我把 @Ignore 放到其他之前的 @Test 那个通过 和这个新的 @Test 我删除@Ignore 一切正常。

因此,添加这个有效或需要数据库连接的新 @Test 方法会出现以下异常:

Caused by: org.springframework.beans.BeanInstantiationException: 
Failed to instantiate [javax.sql.DataSource]: 
Factory method 'dataSource' threw exception; 
nested exception is com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: 
Failed to initialize pool: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
    a
...
Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: 
Failed to initialize pool: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
    a 
...
Caused by: java.sql.SQLNonTransientConnectionException: 
Could not create connection to database server. 
Attempted reconnect 3 times. Giving up.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:526)
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: 24
    at com.mysql.cj.mysqla.io.Buffer.readInteger(Buffer.java:271)

我当前的设置是:

@Bean(destroyMethod = "close")
public DataSource dataSource() throws SQLException {

    HikariConfig hc = new HikariConfig();

    hc.setDriverClassName(environment.getProperty("mysql.driverClass"));
    hc.setJdbcUrl(environment.getProperty("mysql.jdbcUrl"));
    hc.setUsername(environment.getProperty("mysql.user"));
    hc.setPassword(environment.getProperty("mysql.password"));

    hc.setPoolName(environment.getProperty("hikaricp.poolName"));

    hc.addDataSourceProperty("databaseName", environment.getProperty("hikaricp.databaseName"));
    hc.addDataSourceProperty("cachePrepStmts", environment.getProperty("hikaricp.cachePrepStmts"));
    hc.addDataSourceProperty("prepStmtCacheSize", environment.getProperty("hikaricp.prepStmtCacheSize"));
    hc.addDataSourceProperty("prepStmtCacheSqlLimit", environment.getProperty("hikaricp.prepStmtCacheSqlLimit"));
    hc.addDataSourceProperty("useServerPrepStmts", environment.getProperty("hikaricp.useServerPrepStmts"));

    HikariDataSource hds = new HikariDataSource(hc);

    return hds;
}

hikaricp.poolName = "hikaricp-channels-pool"
hikaricp.databaseName = batch
hikaricp.cachePrepStmts = true
hikaricp.prepStmtCacheSize = 250
hikaricp.prepStmtCacheSqlLimit = 2048
hikaricp.useServerPrepStmts = true

mysql.user = root
mysql.password = somepassword
mysql.driverClass = com.mysql.cj.jdbc.Driver
mysql.jdbcUrl = jdbc:mysql://localhost:3306/batch?autoReconnect=true&useSSL=false

需要什么额外配置吗?

阿尔法

版本 01:

版本 02:

关于 DEBUG 报告:

111483 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - dataSourceJNDI..................none 
111483 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - dataSourceProperties............{password=<masked>, prepStmtCacheSqlLimit=2048, databaseName=batch, cachePrepStmts=true, useServerPrepStmts=true, maximumPoolSize=2, prepStmtCacheSize=250} 
111483 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - driverClassName................."com.mysql.cj.jdbc.Driver" 
111483 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - healthCheckProperties...........{} 
111484 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - healthCheckRegistry.............none 
111484 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - idleTimeout.....................600000 
111484 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - initializationFailFast..........true 
111485 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - initializationFailTimeout.......1 
111485 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - isolateInternalQueries..........false 
111485 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - jdbc4ConnectionTest.............false 
111485 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - jdbcUrl........................."jdbc:mysql://localhost:3306/batch?useSSL=false" 
111486 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - leakDetectionThreshold..........0 
111486 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - maxLifetime.....................1800000 
111486 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - maximumPoolSize.................10 
111486 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - metricRegistry..................none 
111486 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - metricsTrackerFactory...........none 
111487 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - minimumIdle.....................10 
111487 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - password........................<masked> 
111487 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - poolName........................""hikaricp-channels-pool"" 
111487 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - readOnly........................false 
111487 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - registerMbeans..................false 
111488 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - scheduledExecutor...............none 
111488 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - scheduledExecutorService........internal 
111488 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - threadFactory...................internal 
111488 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - transactionIsolation............default 
111488 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - username........................"root" 
111488 [Test worker] DEBUG com.zaxxer.hikari.HikariConfig - validationTimeout...............5000 

从上面我确实意识到我的 hc.addDataSourceProperty("maximumPoolSize", 2) 反映在

dataSourceProperties............{
  password=<masked>,
  prepStmtCacheSqlLimit=2048, 
  databaseName=batch, 
  cachePrepStmts=true, 
  useServerPrepStmts=true, 
  maximumPoolSize=2,  <------ 
  prepStmtCacheSize=250}

maximumPoolSize.................10

日志输出跟随此错误堆栈跟踪

111488 [Test worker] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Starting... 
111495 [Test worker] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - Added connection com.mysql.cj.jdbc.ConnectionImpl@47cb32d6 
111495 [Test worker] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Start completed. 
111595 ["hikaricp-channels-pool" housekeeper] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - Pool stats (total=10, active=0, idle=10, waiting=0)  
111598 ["hikaricp-channels-pool" connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - Added connection com.mysql.cj.jdbc.ConnectionImpl@2e943239 
111606 ["hikaricp-channels-pool" connection adder] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Failed to create/setup connection: Could not create connection to database server. 
111607 ["hikaricp-channels-pool" connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - Cannot acquire connection from data source 
java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: 24
    at com.mysql.cj.mysqla.io.Buffer.readInteger(Buffer.java:271)
    at com.mysql.cj.mysqla.io.MysqlaCapabilities.setInitialHandshakePacket(MysqlaCapabilities.java:62)

出现在其他地方其他相同的错误信息有:

Pool stats (total=1, active=0, idle=1, waiting=0)

上面显示的 longs 两个输出位于 .log 文件的中间。就在最下面,出现了很多次。

119835 [Thread-7] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Shutdown completed. 
119824 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@77d65ca2: (connection evicted) 
119828 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@121be945: (connection evicted) 
119836 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@5ca8ce8f: (connection evicted) 
119829 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@4734a941: (connection evicted) 
119829 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@33a9bf9d: (connection evicted) 
119838 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@15f6d748: (connection evicted) 
119839 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@716bc18a: (connection evicted) 
119839 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@28da7bac: (connection evicted) 
119839 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@1cd0e2cb: (connection evicted) 
119839 [Thread-5] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - After shutdown stats (total=0, active=0, idle=0, waiting=0) 
119839 [Thread-5] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Shutdown completed. 
119832 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@72a586ee: (connection evicted) 
119835 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@25b65e9a: (connection evicted) 
119840 [Thread-17] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - After shutdown stats (total=0, active=0, idle=0, waiting=0) 
119841 [Thread-17] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Shutdown completed. 
119841 [Thread-6] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - After shutdown stats (total=0, active=0, idle=0, waiting=0) 
119841 [Thread-6] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Shutdown completed. 
119840 [Thread-16] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - After shutdown stats (total=0, active=0, idle=0, waiting=0) 
119843 [Thread-16] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Shutdown completed. 
119840 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@73c94047: (connection evicted) 
119841 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@70a8a2ea: (connection evicted) 
119845 ["hikaricp-channels-pool" connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - "hikaricp-channels-pool" - Closing connection com.mysql.cj.jdbc.ConnectionImpl@17dcf81f: (connection evicted) 
119845 [Thread-15] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - After shutdown stats (total=0, active=0, idle=0, waiting=0) 
119846 [Thread-15] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Shutdown completed. 
119846 [Thread-10] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - After shutdown stats (total=0, active=0, idle=0, waiting=0) 
119846 [Thread-10] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Shutdown completed. 
123927 [Thread-19] DEBUG com.zaxxer.hikari.pool.HikariPool - "hikaricp-channels-pool" - After shutdown stats (total=0, active=0, idle=0, waiting=0) 
123928 [Thread-19] INFO  com.zaxxer.hikari.HikariDataSource - "hikaricp-channels-pool" - Shutdown completed. 

现在只是改变:

    //hc.addDataSourceProperty("maximumPoolSize", 2);
    hc.setMaximumPoolSize(2);

全部通过。

从这次经历中,我会提出一些'issues'通过GitHub如何改进当前文档的建议。

我想你绝对不想autoReconnect。此外,对于测试,您可能不需要 10 的池大小,请尝试 1 或 2。还要为 com.zaxxer.hikari 启用 DEBUG 日志记录,并确保池在测试之间正确关闭。