From 844d759cf30daa0309fe0cad9ffe31afa04c321e Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 19 May 2015 23:00:51 +0900 Subject: [PATCH 01/25] Updated changes log --- CHANGES | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES b/CHANGES index 9eae5f1c..4098dd14 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,11 @@ HikariCP Changes +Changes in 2.3.8 + + * Rollback Javassist to version 3.18.2-GA due to reported Java 8 compatibility issues. + + * Suppress chatty debug logs during shutdown. + Changes in 2.3.7 * Try harder at resolving the driver by various means when both driverClassName and jdbcUrl From 6ac180b91d1bcdda7444156b9a5e21782766e27b Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 19 May 2015 23:06:55 +0900 Subject: [PATCH 02/25] [maven-release-plugin] prepare release HikariCP-2.3.8 --- hikaricp-java6/pom.xml | 4 ++-- hikaricp/pom.xml | 4 ++-- pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hikaricp-java6/pom.xml b/hikaricp-java6/pom.xml index c921cc5c..22e617ed 100644 --- a/hikaricp-java6/pom.xml +++ b/hikaricp-java6/pom.xml @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.2 + HikariCP-2.3.8 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.8-SNAPSHOT + 2.3.8 diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index da1c89d8..ec17bcae 100644 --- a/hikaricp/pom.xml +++ b/hikaricp/pom.xml @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.2 + HikariCP-2.3.8 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.8-SNAPSHOT + 2.3.8 diff --git a/pom.xml b/pom.xml index 729fca12..99398760 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.8-SNAPSHOT + 2.3.8 pom HikariCP-parent @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.2 + HikariCP-2.3.8 From 162e71862c6b2c73a072f3c827e2c827bc948a0d Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 19 May 2015 23:07:02 +0900 Subject: [PATCH 03/25] [maven-release-plugin] prepare for next development iteration --- hikaricp-java6/pom.xml | 4 ++-- hikaricp/pom.xml | 4 ++-- pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hikaricp-java6/pom.xml b/hikaricp-java6/pom.xml index 22e617ed..d5cf1f6d 100644 --- a/hikaricp-java6/pom.xml +++ b/hikaricp-java6/pom.xml @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.8 + HikariCP-2.3.2 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.8 + 2.3.9-SNAPSHOT diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index ec17bcae..122608d5 100644 --- a/hikaricp/pom.xml +++ b/hikaricp/pom.xml @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.8 + HikariCP-2.3.2 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.8 + 2.3.9-SNAPSHOT diff --git a/pom.xml b/pom.xml index 99398760..f2edfac9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.8 + 2.3.9-SNAPSHOT pom HikariCP-parent @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.8 + HikariCP-2.3.2 From fde1885a2a86f0ebf085fca52538d5347c9ecd9c Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Wed, 20 May 2015 16:36:58 +0900 Subject: [PATCH 04/25] Update version --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2d05a8a4..0848963b 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ _Java 8 maven artifact:_ com.zaxxer HikariCP - 2.3.7 + 2.3.8 compile ``` @@ -22,7 +22,7 @@ _Java 6 and Java 7 maven artifact:_ com.zaxxer HikariCP-java6 - 2.3.7 + 2.3.8 compile ``` From 7caebb13a2a521c99ba15170c9eaf723fe8f5295 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Wed, 20 May 2015 22:48:17 +0900 Subject: [PATCH 05/25] Fixes #318 add check to avoid instantiation of mbean server in the case that registration is disabled. --- .../src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java index a972fed9..1bd86aa9 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java @@ -84,6 +84,10 @@ public final class HikariMBeanElf */ public static void unregisterMBeans(final HikariConfig configuration, final BaseHikariPool pool) { + if (!configuration.isRegisterMbeans()) { + return; + } + try { final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); From 46669f70d02e43915fc02b32d78c6aaa21616bb5 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Wed, 17 Jun 2015 09:32:25 +0900 Subject: [PATCH 06/25] Merge improved close connection debug logging into 2.3.x branch. --- .../com/zaxxer/hikari/pool/BaseHikariPool.java | 10 +++++----- .../com/zaxxer/hikari/pool/PoolBagEntry.java | 2 +- .../com/zaxxer/hikari/pool/PoolUtilities.java | 17 ++++++++++++----- .../java/com/zaxxer/hikari/ShutdownTest.java | 2 +- .../java/com/zaxxer/hikari/pool/HikariPool.java | 15 +++++++++------ .../java/com/zaxxer/hikari/pool/HikariPool.java | 15 +++++++++------ 6 files changed, 37 insertions(+), 24 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java index 5a062c82..50c839b7 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java @@ -205,7 +205,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen final long now = System.currentTimeMillis(); if (bagEntry.evicted || (now - bagEntry.lastAccess > ALIVE_BYPASS_WINDOW && !isConnectionAlive(bagEntry.connection))) { - closeConnection(bagEntry); // Throw away the dead connection and try again + closeConnection(bagEntry, "(connection evicted or dead)"); // Throw away the dead connection and try again timeout = hardTimeout - elapsedTimeMs(start); } else { @@ -239,7 +239,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen if (bagEntry.evicted) { LOGGER.debug("Connection returned to pool {} is broken or evicted. Closing connection.", configuration.getPoolName()); - closeConnection(bagEntry); + closeConnection(bagEntry, "(connection broken or evicted)"); } else { connectionBag.requite(bagEntry); @@ -293,7 +293,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen */ public final void evictConnection(IHikariConnectionProxy proxyConnection) { - closeConnection(proxyConnection.getPoolBagEntry()); + closeConnection(proxyConnection.getPoolBagEntry(), "(connection evicted by user)"); } /** @@ -459,7 +459,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen if (poolState == POOL_RUNNING) { LOGGER.debug("Connection attempt to database {} failed: {}", configuration.getPoolName(), e.getMessage(), e); } - poolUtils.quietlyCloseConnection(connection); + poolUtils.quietlyCloseConnection(connection, "(exception during connection creation)"); } } @@ -495,7 +495,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen * * @param connectionProxy the connection to actually close */ - protected abstract void closeConnection(final PoolBagEntry bagEntry); + protected abstract void closeConnection(final PoolBagEntry bagEntry, final String closureReason); /** * Check whether the connection is alive or not. diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java index c94fea8f..57f195d5 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java @@ -51,7 +51,7 @@ public final class PoolBagEntry implements IConcurrentBagEntry { // If we can reserve it, close it if (pool.connectionBag.reserve(PoolBagEntry.this)) { - pool.closeConnection(PoolBagEntry.this); + pool.closeConnection(PoolBagEntry.this, "(connection reached maxLifetime)"); } else { // else the connection is "in-use" and we mark it for eviction by pool.releaseConnection() or the housekeeper diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java index 6db01183..7a871e4c 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java @@ -46,17 +46,24 @@ public final class PoolUtilities * * @param connection the connection to close */ - public void quietlyCloseConnection(final Connection connection) + public void quietlyCloseConnection(final Connection connection, final String closureReason) { try { - LOGGER.debug("Closing connection {}", connection); - if (connection != null && !connection.isClosed()) { - setNetworkTimeout(connection, TimeUnit.SECONDS.toMillis(30)); + if (connection == null || connection.isClosed()) { + return; + } + + LOGGER.debug("Closing connection {} in pool {} {}", connection, poolName, closureReason); + try { + setNetworkTimeout(connection, TimeUnit.SECONDS.toMillis(15)); + } + finally { + // continue with the close even if setNetworkTimeout() throws (due to driver poorly behaving drivers) connection.close(); } } catch (Throwable e) { - LOGGER.debug("{} - Exception closing connection {}", poolName, connection.toString(), e); + LOGGER.debug("Exception closing connection {} in pool {} {}", connection, poolName, closureReason, e); } } diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java index 42b05d8b..dfcda400 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java +++ b/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java @@ -305,7 +305,7 @@ public class ShutdownTest Assert.fail(e.getMessage()); } finally { - new PoolUtilities(config).quietlyCloseConnection(connection); + new PoolUtilities(config).quietlyCloseConnection(connection, "(because this is a test)"); ds.shutdown(); } }; diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 289d994a..bd9fe91e 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -74,7 +74,7 @@ public final class HikariPool extends BaseHikariPool for (PoolBagEntry bagEntry : connectionBag.values(STATE_NOT_IN_USE)) { if (connectionBag.reserve(bagEntry)) { - closeConnection(bagEntry); + closeConnection(bagEntry, "(connection evicted by user)"); } } } @@ -89,7 +89,7 @@ public final class HikariPool extends BaseHikariPool * @param connectionProxy the connection to actually close */ @Override - protected void closeConnection(final PoolBagEntry bagEntry) + protected void closeConnection(final PoolBagEntry bagEntry, final String closureReason) { bagEntry.cancelMaxLifeTermination(); if (connectionBag.remove(bagEntry)) { @@ -100,7 +100,7 @@ public final class HikariPool extends BaseHikariPool final Connection connection = bagEntry.connection; closeConnectionExecutor.execute(new Runnable() { public void run() { - poolUtils.quietlyCloseConnection(connection); + poolUtils.quietlyCloseConnection(connection, closureReason); } }); } @@ -166,7 +166,7 @@ public final class HikariPool extends BaseHikariPool if (e instanceof InterruptedException) { throw (InterruptedException) e; } - poolUtils.quietlyCloseConnection(bagEntry.connection); + poolUtils.quietlyCloseConnection(bagEntry.connection, "(connection aborted during shutdown)"); } finally { bagEntry.connection = null; @@ -212,8 +212,11 @@ public final class HikariPool extends BaseHikariPool for (PoolBagEntry bagEntry : connectionBag.values(STATE_NOT_IN_USE)) { if (connectionBag.reserve(bagEntry)) { - if (bagEntry.evicted || (idleTimeout > 0L && now > bagEntry.lastAccess + idleTimeout)) { - closeConnection(bagEntry); + if (bagEntry.evicted) { + closeConnection(bagEntry, "(connection evicted)"); + } + else if (idleTimeout > 0L && now > bagEntry.lastAccess + idleTimeout) { + closeConnection(bagEntry, "(connection passed idleTimeout)"); } else { connectionBag.unreserve(bagEntry); diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 19e26a4d..e5a72c67 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -69,7 +69,7 @@ public final class HikariPool extends BaseHikariPool public void softEvictConnections() { connectionBag.values(STATE_IN_USE).forEach(bagEntry -> bagEntry.evicted = true); - connectionBag.values(STATE_NOT_IN_USE).stream().filter(p -> connectionBag.reserve(p)).forEach(bagEntry -> closeConnection(bagEntry)); + connectionBag.values(STATE_NOT_IN_USE).stream().filter(p -> connectionBag.reserve(p)).forEach(bagEntry -> closeConnection(bagEntry, "(connection evicted by user)")); } // *********************************************************************** @@ -82,7 +82,7 @@ public final class HikariPool extends BaseHikariPool * @param connectionProxy the connection to actually close */ @Override - protected void closeConnection(final PoolBagEntry bagEntry) + protected void closeConnection(final PoolBagEntry bagEntry, final String closureReason) { bagEntry.cancelMaxLifeTermination(); if (connectionBag.remove(bagEntry)) { @@ -91,7 +91,7 @@ public final class HikariPool extends BaseHikariPool LOGGER.warn("Internal accounting inconsistency, totalConnections={}", tc, new Exception()); } final Connection connection = bagEntry.connection; - closeConnectionExecutor.execute(() -> { poolUtils.quietlyCloseConnection(connection); }); + closeConnectionExecutor.execute(() -> { poolUtils.quietlyCloseConnection(connection, closureReason); }); } bagEntry.connection = null; } @@ -148,7 +148,7 @@ public final class HikariPool extends BaseHikariPool bagEntry.connection.abort(assassinExecutor); } catch (SQLException | NoSuchMethodError | AbstractMethodError e) { - poolUtils.quietlyCloseConnection(bagEntry.connection); + poolUtils.quietlyCloseConnection(bagEntry.connection, "(connection aborted during shutdown)"); } finally { bagEntry.connection = null; @@ -194,8 +194,11 @@ public final class HikariPool extends BaseHikariPool final long idleTimeout = configuration.getIdleTimeout(); connectionBag.values(STATE_NOT_IN_USE).stream().filter(p -> connectionBag.reserve(p)).forEach(bagEntry -> { - if (bagEntry.evicted || (idleTimeout > 0L && now > bagEntry.lastAccess + idleTimeout)) { - closeConnection(bagEntry); + if (bagEntry.evicted) { + closeConnection(bagEntry, "(connection evicted)"); + } + else if (idleTimeout > 0L && now > bagEntry.lastAccess + idleTimeout) { + closeConnection(bagEntry, "(connection passed idleTimeout)"); } else { connectionBag.unreserve(bagEntry); From 7542f02500d1713537e985bdc52530834de5549d Mon Sep 17 00:00:00 2001 From: Dimitrios Liapis Date: Wed, 17 Jun 2015 16:41:03 +0100 Subject: [PATCH 07/25] Changing the documented jConnect Sybase Driver to an implementation that works The jConnect Driver (as of version 7.0) has two package implementations for the Driver: 1) com.sybase.jdbcx.SybDataSource and 2) com.sybase.jdbc4.jdbc.SybDataSource . If 1) is used then an exception is thrown from the HikariCP since it's looking for a default constructor that is not there. Switching to 2) the driver starts up successfully and it's fully operational, therefore I'm changing this documentation line to reflect that. ps. HikariCP version 2.3.8 as advised since jdk8 thanks, Dimitrios --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0848963b..e4038498 100644 --- a/README.md +++ b/README.md @@ -365,7 +365,7 @@ Here is a list of JDBC *DataSource* classes for popular databases: | Oracle | Oracle | oracle.jdbc.pool.OracleDataSource | | PostgreSQL | pgjdbc-ng | com.impossibl.postgres.jdbc.PGDataSource | | PostgreSQL | PostgreSQL | org.postgresql.ds.PGSimpleDataSource | -| SyBase | jConnect | com.sybase.jdbcx.SybDataSource | +| SyBase | jConnect | com.sybase.jdbc4.jdbc.SybDataSource | ### Play Framework Plugin From 6899e5dc6efeacb523542952e5e37220318f5e41 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 18 Jun 2015 20:41:00 +0900 Subject: [PATCH 08/25] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e4038498..09e9b80f 100644 --- a/README.md +++ b/README.md @@ -359,14 +359,17 @@ Here is a list of JDBC *DataSource* classes for popular databases: | IBM DB2 | DB2 | com.ibm.db2.jcc.DB2SimpleDataSource | | H2 | H2 | org.h2.jdbcx.JdbcDataSource | | HSQLDB | HSQLDB | org.hsqldb.jdbc.JDBCDataSource | +| IBM AS400 | IBM | com.ibm.as400.access.AS400JDBCDriver | | MariaDB & MySQL | MariaDB | org.mariadb.jdbc.MySQLDataSource | | MySQL | Connector/J | com.mysql.jdbc.jdbc2.optional.MysqlDataSource | | MS SQL Server | Microsoft | com.microsoft.sqlserver.jdbc.SQLServerDataSource | | Oracle | Oracle | oracle.jdbc.pool.OracleDataSource | | PostgreSQL | pgjdbc-ng | com.impossibl.postgres.jdbc.PGDataSource | | PostgreSQL | PostgreSQL | org.postgresql.ds.PGSimpleDataSource | +| SAP MaxDB | SAP | com.sap.dbtech.jdbc.DriverSapDB | | SyBase | jConnect | com.sybase.jdbc4.jdbc.SybDataSource | + ### Play Framework Plugin A new plugin has come up for the the Play framework; [play-hikaricp](http://edulify.github.io/play-hikaricp.edulify.com/). If you're using the excellent Play framework, your application deserves HikariCP. Thanks Edulify Team! From 24d03706e22257ebb6bf42840deb990b59db3aae Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 26 Jun 2015 23:31:13 +0900 Subject: [PATCH 09/25] Add driver.acceptsUrl() check. --- .../com/zaxxer/hikari/util/DriverDataSource.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/DriverDataSource.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/util/DriverDataSource.java index 39af90cf..51a35a0d 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/DriverDataSource.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/util/DriverDataSource.java @@ -59,7 +59,7 @@ public final class DriverDataSource implements DataSource while (drivers.hasMoreElements()) { Driver d = drivers.nextElement(); if (d.getClass().getName().equals(driverClassName)) { - this.driver = d; + driver = d; break; } } @@ -68,7 +68,7 @@ public final class DriverDataSource implements DataSource LOGGER.warn("Registered driver with driverClassName={} was not found, trying direct instantiation.", driverClassName); try { Class driverClass = this.getClass().getClassLoader().loadClass(driverClassName); - this.driver = (Driver) driverClass.newInstance(); + driver = (Driver) driverClass.newInstance(); } catch (Exception e) { LOGGER.warn("Could not instantiate instance of driver class {}, trying JDBC URL resolution", driverClassName, e); @@ -76,14 +76,17 @@ public final class DriverDataSource implements DataSource } } - if (driver == null) { - try { + try { + if (driver == null) { driver = DriverManager.getDriver(jdbcUrl); } - catch (SQLException e) { - throw new RuntimeException("Unable to get driver instance for jdbcUrl=" + jdbcUrl, e); + else if (!driver.acceptsURL(jdbcUrl)) { + throw new RuntimeException("Driver " + driverClassName + " claims to not accept JDBC URL " + jdbcUrl); } } + catch (SQLException e) { + throw new RuntimeException("Unable to get driver instance for jdbcUrl=" + jdbcUrl, e); + } } @Override From 276b919e04a94c8b58ca4732fb5dec57f9c7896f Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 27 Jun 2015 00:33:45 +0900 Subject: [PATCH 10/25] Add driver.acceptsUrl() check. --- hikaricp-common/pom.xml | 2 +- .../src/test/java/com/zaxxer/hikari/JdbcDriverTest.java | 2 +- hikaricp-java6/pom.xml | 1 - hikaricp/pom.xml | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/hikaricp-common/pom.xml b/hikaricp-common/pom.xml index e03caad5..aa909305 100644 --- a/hikaricp-common/pom.xml +++ b/hikaricp-common/pom.xml @@ -13,6 +13,6 @@ com.zaxxer HikariCP-parent - 2.3.7-SNAPSHOT + 2.3.9-SNAPSHOT \ No newline at end of file diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java b/hikaricp-common/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java index 8ccaca2c..df3057f5 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java +++ b/hikaricp-common/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java @@ -78,7 +78,7 @@ public class JdbcDriverTest ds = new HikariDataSource(config); } catch (RuntimeException e) { - Assert.assertTrue(e.getMessage().contains("Unable to get driver")); + Assert.assertTrue(e.getMessage().contains("claims to not accept")); } } } diff --git a/hikaricp-java6/pom.xml b/hikaricp-java6/pom.xml index d5cf1f6d..89e3b05a 100644 --- a/hikaricp-java6/pom.xml +++ b/hikaricp-java6/pom.xml @@ -20,7 +20,6 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.2 diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index 122608d5..4e0edcff 100644 --- a/hikaricp/pom.xml +++ b/hikaricp/pom.xml @@ -20,7 +20,6 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.2 From f20dc06241c96fb3eb88922f2cf2b3eb3e5af772 Mon Sep 17 00:00:00 2001 From: Urs Wolfer Date: Tue, 30 Jun 2015 09:10:30 +0200 Subject: [PATCH 11/25] Add example how to configure port for PGSimpleDataSource --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 09e9b80f..6e60b1b2 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,7 @@ dataSourceClassName=org.postgresql.ds.PGSimpleDataSource dataSource.user=test dataSource.password=test dataSource.databaseName=mydb +dataSource.portNumber=5432 dataSource.serverName=localhost ``` or ``java.util.Properties`` based: From 60e0eb1b8bb87242665c37e1f3ecf549b2457206 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Wed, 1 Jul 2015 23:07:54 +0900 Subject: [PATCH 12/25] Fix #334 caused by moving the ``HikariPoolMBean`` into the ``com.zaxxer.hikari`` package. Classes with the ``xxxMBean`` naming convention must reside in the same package. Renaming the class to ``xxxMXBean`` allows it to reside anywhere. --- .../src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java | 2 +- .../hikari/{HikariConfigMBean.java => HikariConfigMXBean.java} | 2 +- .../src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java | 2 +- .../hikari/pool/{HikariPoolMBean.java => HikariPoolMXBean.java} | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename hikaricp-common/src/main/java/com/zaxxer/hikari/{HikariConfigMBean.java => HikariConfigMXBean.java} (99%) rename hikaricp-common/src/main/java/com/zaxxer/hikari/pool/{HikariPoolMBean.java => HikariPoolMXBean.java} (96%) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java index 5471c835..c8dd6127 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java @@ -38,7 +38,7 @@ import com.codahale.metrics.health.HealthCheckRegistry; import com.zaxxer.hikari.util.PropertyBeanSetter; import com.zaxxer.hikari.util.UtilityElf; -public abstract class AbstractHikariConfig implements HikariConfigMBean +public abstract class AbstractHikariConfig implements HikariConfigMXBean { private static final Logger LOGGER = LoggerFactory.getLogger(HikariConfig.class); diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariConfigMBean.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariConfigMXBean.java similarity index 99% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/HikariConfigMBean.java rename to hikaricp-common/src/main/java/com/zaxxer/hikari/HikariConfigMXBean.java index 11d8f95f..2475aaef 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariConfigMBean.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariConfigMXBean.java @@ -21,7 +21,7 @@ package com.zaxxer.hikari; * * @author Brett Wooldridge */ -public interface HikariConfigMBean +public interface HikariConfigMXBean { /** * Get the maximum number of milliseconds that a client will wait for a connection from the pool. If this diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java index 50c839b7..94ff0819 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java @@ -67,7 +67,7 @@ import com.zaxxer.hikari.util.IBagStateListener; * * @author Brett Wooldridge */ -public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListener +public abstract class BaseHikariPool implements HikariPoolMXBean, IBagStateListener { protected final Logger LOGGER = LoggerFactory.getLogger(getClass()); private static final long ALIVE_BYPASS_WINDOW = Long.getLong("com.zaxxer.hikari.aliveBypassWindow", 1000L); diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariPoolMXBean.java similarity index 96% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java rename to hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariPoolMXBean.java index 8672dd7d..84ea105b 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariPoolMXBean.java @@ -21,7 +21,7 @@ package com.zaxxer.hikari.pool; * * @author Brett Wooldridge */ -public interface HikariPoolMBean +public interface HikariPoolMXBean { int getIdleConnections(); From e51cd98d0666947a796baa81b00abf5e82191b0a Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Mon, 6 Jul 2015 21:59:43 +0900 Subject: [PATCH 13/25] Fix #340 ignore exception setting read only --- .../main/java/com/zaxxer/hikari/pool/PoolUtilities.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java index 7a871e4c..bf215d79 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java @@ -4,6 +4,7 @@ import static com.zaxxer.hikari.util.UtilityElf.createInstance; import java.sql.Connection; import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; import java.sql.Statement; import java.util.Properties; import java.util.concurrent.Executor; @@ -133,7 +134,12 @@ public final class PoolUtilities public void setupConnection(final Connection connection, final boolean isAutoCommit, final boolean isReadOnly, final int transactionIsolation, final String catalog) throws SQLException { connection.setAutoCommit(isAutoCommit); - connection.setReadOnly(isReadOnly); + try { + connection.setReadOnly(isReadOnly); + } + catch (SQLFeatureNotSupportedException e) { + // ignore + } if (transactionIsolation != connection.getTransactionIsolation()) { connection.setTransactionIsolation(transactionIsolation); } From 896ccd9ec98e5da1a5791f5c62f215c4f3db6de7 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Mon, 6 Jul 2015 22:44:53 +0900 Subject: [PATCH 14/25] Fix #339 correct example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e60b1b2..c0274a0b 100644 --- a/README.md +++ b/README.md @@ -338,7 +338,7 @@ props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource") props.setProperty("dataSource.user", "test"); props.setProperty("dataSource.password", "test"); props.setProperty("dataSource.databaseName", "mydb"); -props.setProperty("dataSource.logWriter", new PrintWriter(System.out)); +props.put("dataSource.logWriter", new PrintWriter(System.out)); HikariConfig config = new HikariConfig(props); HikariDataSource ds = new HikariDataSource(config); From 0d245bf1f891f1d09981b67513fae30c0c9f8514 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Wed, 8 Jul 2015 16:43:12 +0900 Subject: [PATCH 15/25] Fix #338 duplicate SQLState from cause into our SQLTimeoutException --- .../main/java/com/zaxxer/hikari/pool/BaseHikariPool.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java index 94ff0819..2e82e64d 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java @@ -28,6 +28,7 @@ import static com.zaxxer.hikari.util.UtilityElf.getTransactionIsolation; import static com.zaxxer.hikari.util.UtilityElf.quietlySleep; import static com.zaxxer.hikari.util.UtilityElf.setRemoveOnCancelPolicy; +import java.lang.Throwable; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLTimeoutException; @@ -224,7 +225,12 @@ public abstract class BaseHikariPool implements HikariPoolMXBean, IBagStateListe } logPoolState("Timeout failure "); - throw new SQLTimeoutException(String.format("Timeout after %dms of waiting for a connection.", elapsedTimeMs(start)), lastConnectionFailure.getAndSet(null)); + String sqlState = null; + final Throwable originalException = lastConnectionFailure.getAndSet(null); + if (originalException instanceof SQLException) { + sqlState = ((SQLException) originalException).getSQLState(); + } + throw new SQLTimeoutException(String.format("Timeout after %dms of waiting for a connection.", elapsedTimeMs(start)), sqlState, originalException); } From f45cafad7fe57fb3cd356c558a526cd1455a1c81 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 10 Jul 2015 10:08:53 +0900 Subject: [PATCH 16/25] Updated changes log for 2.3.9 release --- CHANGES | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 4098dd14..2abad3f9 100644 --- a/CHANGES +++ b/CHANGES @@ -1,11 +1,26 @@ HikariCP Changes +Changes in 2.3.9 + + * Fixed regression in JMX MBean registration. + + * Propagate/pass-thru SQLState code, if available, when throwing our own SQLTimeoutException + from getConnection(). + + * Validate DriverManager-based connections via a call to driver.acceptsUrl(). + + * Ignore exceptions thrown from setReadOnly() during connection setup for databases that + throw SQLFeatureUnsupported exceptions. + + * Improved debug logging for connection closing, providing a reason that the pool decided + to close the connection. + Changes in 2.3.8 * Rollback Javassist to version 3.18.2-GA due to reported Java 8 compatibility issues. * Suppress chatty debug logs during shutdown. - + Changes in 2.3.7 * Try harder at resolving the driver by various means when both driverClassName and jdbcUrl @@ -13,7 +28,7 @@ Changes in 2.3.7 * Allow a specifically set DataSource instance to override other settings such as jdbcUrl, dataSourceClassName, or driverClassName. - + * Fixed issue where, in the case of a driver-based configuration (jdbcUrl), we were not initialising the network timeout Executor. From 26b343b465fc5550b4fedb93334075cad996fbdd Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 10 Jul 2015 10:13:12 +0900 Subject: [PATCH 17/25] [maven-release-plugin] prepare release HikariCP-2.3.9 --- hikaricp-java6/pom.xml | 3 ++- hikaricp/pom.xml | 5 +++-- pom.xml | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/hikaricp-java6/pom.xml b/hikaricp-java6/pom.xml index 89e3b05a..4d4098d8 100644 --- a/hikaricp-java6/pom.xml +++ b/hikaricp-java6/pom.xml @@ -20,6 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git + HikariCP-2.3.9 @@ -46,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.9-SNAPSHOT + 2.3.9 diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index 4e0edcff..6bb33993 100644 --- a/hikaricp/pom.xml +++ b/hikaricp/pom.xml @@ -20,7 +20,8 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - + HikariCP-2.3.9 + @@ -46,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.9-SNAPSHOT + 2.3.9 diff --git a/pom.xml b/pom.xml index f2edfac9..be175b11 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.9-SNAPSHOT + 2.3.9 pom HikariCP-parent @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.2 + HikariCP-2.3.9 From 7d8d0c0c5a5a8db44aecd5ad9541490990b8852b Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 10 Jul 2015 10:13:18 +0900 Subject: [PATCH 18/25] [maven-release-plugin] prepare for next development iteration --- hikaricp-java6/pom.xml | 4 ++-- hikaricp/pom.xml | 4 ++-- pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hikaricp-java6/pom.xml b/hikaricp-java6/pom.xml index 4d4098d8..6aca26d7 100644 --- a/hikaricp-java6/pom.xml +++ b/hikaricp-java6/pom.xml @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.9 + HEAD @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.9 + 2.3.10-SNAPSHOT diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index 6bb33993..e2eb85ca 100644 --- a/hikaricp/pom.xml +++ b/hikaricp/pom.xml @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.9 + HEAD @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.9 + 2.3.10-SNAPSHOT diff --git a/pom.xml b/pom.xml index be175b11..52b669c1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.9 + 2.3.10-SNAPSHOT pom HikariCP-parent @@ -20,7 +20,7 @@ scm:git:git@github.com:brettwooldridge/HikariCP.git scm:git:git@github.com:brettwooldridge/HikariCP.git git@github.com:brettwooldridge/HikariCP.git - HikariCP-2.3.9 + HikariCP-2.3.2 From bea6e3696884209176c1b5c869862359f6913cd0 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 10 Jul 2015 23:37:51 +0900 Subject: [PATCH 19/25] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c0274a0b..10296ee6 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ _Java 8 maven artifact:_ com.zaxxer HikariCP - 2.3.8 + 2.3.9 compile ``` @@ -22,7 +22,7 @@ _Java 6 and Java 7 maven artifact:_ com.zaxxer HikariCP-java6 - 2.3.8 + 2.3.9 compile ``` From 71dd59a3cd53dc0a905b41bcaf3ccd4c05abc23c Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 10 Jul 2015 23:42:58 +0900 Subject: [PATCH 20/25] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 10296ee6..af8a50c0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![](https://github.com/brettwooldridge/HikariCP/wiki/Hikari.png) HikariCP It's Faster. [![Travis branch](https://img.shields.io/travis/joyent/node/v0.6.svg)](https://travis-ci.org/brettwooldridge/HikariCP)[![Issue Stats](http://issuestats.com/github/brettwooldridge/HikariCP/badge/issue?style=flat&concise=true)](http://issuestats.com/github/brettwooldridge/HikariCP)[![Coverage Status](https://img.shields.io/coveralls/brettwooldridge/HikariCP/dev.svg)](https://coveralls.io/r/brettwooldridge/HikariCP?branch=dev)
Hi·ka·ri [hi·ka·'lē] (*Origin: Japanese*): light; ray. +![](https://github.com/brettwooldridge/HikariCP/wiki/Hikari.png) HikariCP It's Faster. [![Travis branch](https://travis-ci.org/brettwooldridge/HikariCP.svg?branch=2.3.x)](https://travis-ci.org/brettwooldridge/HikariCP)[![Issue Stats](http://issuestats.com/github/brettwooldridge/HikariCP/badge/issue?style=flat&concise=true)](http://issuestats.com/github/brettwooldridge/HikariCP)[![Coverage Status](https://coveralls.io/repos/brettwooldridge/HikariCP/badge.svg?branch=2.3.x&service=github)](https://coveralls.io/github/brettwooldridge/HikariCP?branch=2.3.x)
Hi·ka·ri [hi·ka·'lē] (*Origin: Japanese*): light; ray. ========== Fast, simple, reliable. HikariCP is a "zero-overhead" production ready JDBC connection pool. Coming in at roughly 70Kb, the library is very light. Read about [how we do it here](https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole). From ada15b63d66c3cac7b7aa8b6420e8717ba7841d3 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 11 Jul 2015 10:01:54 +0900 Subject: [PATCH 21/25] Logging useful to troubleshoot slow pool cycling. --- .../java/com/zaxxer/hikari/proxy/ConnectionProxy.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java index 4755efd4..8a191624 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java @@ -108,8 +108,8 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy boolean isForceClose = sqlState.startsWith("08") | SQL_ERRORS.contains(sqlState); if (isForceClose) { bagEntry.evicted = true; - LOGGER.warn("Connection {} ({}) marked as broken because of SQLSTATE({}), ErrorCode({}).", delegate.toString(), - parentPool.toString(), sqlState, sqle.getErrorCode(), sqle); + LOGGER.warn("Connection {} ({}) marked as broken because of SQLSTATE({}), ErrorCode({}).", delegate, + parentPool, sqlState, sqle.getErrorCode(), sqle); } else if (sqle.getNextException() != null && sqle != sqle.getNextException()) { checkException(sqle.getNextException()); @@ -147,6 +147,9 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy private final void resetConnectionState() throws SQLException { + LOGGER.debug("{} Resetting dirty on {} (readOnlyDirty={},autoCommitDirty={},isolationDirty={},catalogDirty={})", + parentPool, delegate, isReadOnlyDirty, isAutoCommitDirty, isTransactionIsolationDirty, isCatalogDirty); + if (isReadOnlyDirty) { delegate.setReadOnly(parentPool.isReadOnly); } @@ -189,6 +192,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy try { if (isCommitStateDirty && !delegate.getAutoCommit()) { + LOGGER.debug("{} Performing rollback on {} due to dirty commit state.", parentPool, delegate); delegate.rollback(); } From 7ad373ab2f4b147267208f1114cee5755f606639 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 11 Jul 2015 10:11:27 +0900 Subject: [PATCH 22/25] Logging useful to troubleshoot slow pool cycling. --- .../src/main/java/com/zaxxer/hikari/pool/HikariPool.java | 1 + hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java | 1 + 2 files changed, 2 insertions(+) diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index bd9fe91e..44570e3b 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -118,6 +118,7 @@ public final class HikariPool extends BaseHikariPool protected boolean isConnectionAlive(final Connection connection) { try { + LOGGER.debug("Performing alive check for connection {}", connection); final int timeoutSec = (int) TimeUnit.MILLISECONDS.toSeconds(validationTimeout); if (isUseJdbc4Validation) { diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index e5a72c67..caa6e6b9 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -107,6 +107,7 @@ public final class HikariPool extends BaseHikariPool protected boolean isConnectionAlive(final Connection connection) { try { + LOGGER.debug("Performing alive check for connection {}", connection); int timeoutSec = (int) TimeUnit.MILLISECONDS.toSeconds(validationTimeout); if (isUseJdbc4Validation) { From 22e7af1613bd5beb8d522f42e8cb109d7e4ee813 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 16 Jul 2015 13:06:12 +0900 Subject: [PATCH 23/25] Use container infrastrucure --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 2b1b3a72..2ec43b3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: java +sudo: false jdk: - oraclejdk8 From e19c6874431dc2c3046436c2ac249a0ab2ef3457 Mon Sep 17 00:00:00 2001 From: David Schlosnagle Date: Fri, 31 Jul 2015 11:59:50 -0400 Subject: [PATCH 24/25] Ensure closed connections returned to pool If an exception occurs while closing a connection's open statements (e.g. NullPointerException due to concurrent close of statement with connection), the connection was not returned to the pool. We now check for this possibility and ensure the connection is returned to the pool. --- .../zaxxer/hikari/proxy/ConnectionProxy.java | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java index 8a191624..b6dae6c1 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java @@ -178,19 +178,9 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy if (delegate != ClosedConnection.CLOSED_CONNECTION) { leakTask.cancel(); - final int size = openStatements.size(); - if (size > 0) { - for (int i = 0; i < size; i++) { - try { - openStatements.get(i).close(); - } - catch (SQLException e) { - checkException(e); - } - } - } - try { + closeOpenStatements(); + if (isCommitStateDirty && !delegate.getAutoCommit()) { LOGGER.debug("{} Performing rollback on {} due to dirty commit state.", parentPool, delegate); delegate.rollback(); @@ -216,6 +206,26 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy } } + private void closeOpenStatements() + { + final int size = openStatements.size(); + if (size > 0) { + for (int i = 0; i < size; i++) { + try { + Statement statement = openStatements.get(i); + if (statement != null) { + statement.close(); + } + } + catch (SQLException e) { + checkException(e); + } + } + + openStatements.clear(); + } + } + /** {@inheritDoc} */ @Override public boolean isClosed() throws SQLException From 5323c1adbb945fed08b0bc505fbbde8333c2f67d Mon Sep 17 00:00:00 2001 From: David Schlosnagle Date: Sat, 1 Aug 2015 08:57:46 -0400 Subject: [PATCH 25/25] Move internal private method, make statement final Address code review comments --- .../zaxxer/hikari/proxy/ConnectionProxy.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java index b6dae6c1..c22f45ba 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java @@ -145,6 +145,26 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy return statement; } + private final void closeOpenStatements() + { + final int size = openStatements.size(); + if (size > 0) { + for (int i = 0; i < size; i++) { + try { + final Statement statement = openStatements.get(i); + if (statement != null) { + statement.close(); + } + } + catch (SQLException e) { + checkException(e); + } + } + + openStatements.clear(); + } + } + private final void resetConnectionState() throws SQLException { LOGGER.debug("{} Resetting dirty on {} (readOnlyDirty={},autoCommitDirty={},isolationDirty={},catalogDirty={})", @@ -206,26 +226,6 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy } } - private void closeOpenStatements() - { - final int size = openStatements.size(); - if (size > 0) { - for (int i = 0; i < size; i++) { - try { - Statement statement = openStatements.get(i); - if (statement != null) { - statement.close(); - } - } - catch (SQLException e) { - checkException(e); - } - } - - openStatements.clear(); - } - } - /** {@inheritDoc} */ @Override public boolean isClosed() throws SQLException