From 9804b8602eb422622532507f385606f9f2d54a3f Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 3 Mar 2015 12:11:15 +0900 Subject: [PATCH 01/40] Fixes #272 Throw a typed exception for pool initialization failures. --- .../zaxxer/hikari/pool/BaseHikariPool.java | 16 ++------- .../pool/PoolInitializationException.java | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java 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 b7d607dc..784fa5c0 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 @@ -497,7 +497,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen try { if (!addConnection()) { shutdown(); - throw new RuntimeException("Fail-fast during pool initialization", lastConnectionFailure.getAndSet(null)); + throw new PoolInitializationException(lastConnectionFailure.getAndSet(null)); } ConnectionProxy connection = (ConnectionProxy) getConnection(); @@ -506,11 +506,11 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen } catch (SQLException e) { shutdown(); - throw new RuntimeException("Fail-fast during pool initialization", e); + throw new PoolInitializationException(e); } } catch (InterruptedException ie) { - throw new RuntimeException("Fail-fast during pool initialization", ie); + throw new PoolInitializationException(ie); } } @@ -531,16 +531,6 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen return configuration.getConnectionCustomizer(); } - /** - * @param healthCheckRegistry - */ - private void registerHealthChecks(Object healthCheckRegistry) - { - if (healthCheckRegistry != null) { - - } - } - public final void logPoolState(String... prefix) { if (LOGGER.isDebugEnabled()) { diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java new file mode 100644 index 00000000..53fe24c3 --- /dev/null +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2015 Brett Wooldridge + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.zaxxer.hikari.pool; + +/** + * A custom exception thrown if pool initialization fails. + * + * @author Brett Wooldridge + */ +public class PoolInitializationException extends RuntimeException +{ + private static final long serialVersionUID = 929872118275916520L; + + /** + * Construct an exception, possibly wrapping the provided Throwable as the cause. + */ + public PoolInitializationException(Throwable t) + { + super("Exception during pool initialization", t); + } +} From 935155ad769d017ae9ad932fa0ebc2fc6de8af94 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 3 Mar 2015 13:03:19 +0900 Subject: [PATCH 02/40] Update CHANGES --- CHANGES | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGES b/CHANGES index 988f519c..f021e26b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,16 @@ HikariCP Changes +Changes in 2.3.3 + + * Fixed bad interaction with PostgeSQL JDBC driver whereby a SQLException thrown by + PostgreSQL where the getNextException() call returns the original exception and causes + an infinite loop in HikariCP (and eventual stack overflow). + + * Throw a typed Exception rather than a simple RuntimeException when pool initialization + fails. + + * Allow Dropwizard Metrics and HealthChecks to be configured by a JNDI lookup. + Changes in 2.3.2 * Add support for Dropwizard HealthChecks through the introduction of two initial health From b1fde2f9f7e6c751770e40e0f52a5847f14e90aa Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 3 Mar 2015 13:10:40 +0900 Subject: [PATCH 03/40] [maven-release-plugin] prepare release HikariCP-2.3.3 --- 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 f2672303..2e35246f 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.3 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.3-SNAPSHOT + 2.3.3 diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index 72ad807f..d369dd86 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.3 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.3-SNAPSHOT + 2.3.3 diff --git a/pom.xml b/pom.xml index a5995b5d..b2dbd77d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.3-SNAPSHOT + 2.3.3 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.3 From 4ce4fb49aec9d98ddeb576968df40167f923b38b Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 3 Mar 2015 13:10:46 +0900 Subject: [PATCH 04/40] [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 2e35246f..90a0010d 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.3 + HikariCP-2.3.2 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.3 + 2.3.4-SNAPSHOT diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index d369dd86..1586ae93 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.3 + HikariCP-2.3.2 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.3 + 2.3.4-SNAPSHOT diff --git a/pom.xml b/pom.xml index b2dbd77d..2128f6b8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.3 + 2.3.4-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.3 + HikariCP-2.3.2 From 59bc1662681fcf147c1e710f5d2328f0ef6c7271 Mon Sep 17 00:00:00 2001 From: Thies Edeling Date: Tue, 3 Mar 2015 09:50:14 +0100 Subject: [PATCH 05/40] #273, special case for when called to unwrap a DataSource, copying the same behavior as the ConnectionProvider implementations by Hibernate. --- .../hibernate/HikariConnectionProvider.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java index dd79b401..b4c83489 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java @@ -31,6 +31,8 @@ import org.slf4j.LoggerFactory; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; +import javax.sql.DataSource; + /** * Connection provider for Hibernate 4.3. * @@ -125,12 +127,16 @@ public class HikariConnectionProvider implements ConnectionProvider, Configurabl @SuppressWarnings("unchecked") public T unwrap(Class unwrapType) { - if (isUnwrappableAs(unwrapType)) { - return (T) this; - } - else { - throw new UnknownUnwrapTypeException(unwrapType); - } + if ( ConnectionProvider.class.equals( unwrapType ) || + HikariConnectionProvider.class.isAssignableFrom( unwrapType ) ) { + return (T) this; + } + else if ( DataSource.class.isAssignableFrom( unwrapType ) ) { + return (T) this.hds; + } + else { + throw new UnknownUnwrapTypeException( unwrapType ); + } } // ************************************************************************* From f7df7cd0b0a6455c1678350bb5f14050fcaa0d47 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Wed, 4 Mar 2015 23:36:55 +0900 Subject: [PATCH 06/40] Fixes #275 make global lock non-static --- hikaricp-common/pom.xml | 2 +- .../main/java/com/zaxxer/hikari/pool/BaseHikariPool.java | 2 +- .../main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java | 8 +++----- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/hikaricp-common/pom.xml b/hikaricp-common/pom.xml index 51959823..58b76aa2 100644 --- a/hikaricp-common/pom.xml +++ b/hikaricp-common/pom.xml @@ -13,6 +13,6 @@ com.zaxxer HikariCP-parent - 2.3.3-SNAPSHOT + 2.3.4-SNAPSHOT \ No newline at end of file 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 784fa5c0..91b88a58 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 @@ -139,7 +139,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen this.isReadOnly = configuration.isReadOnly(); this.isAutoCommit = configuration.isAutoCommit(); - this.suspendResumeLock = configuration.isAllowPoolSuspension() ? GlobalPoolLock.SUSPEND_RESUME_LOCK : GlobalPoolLock.FAUX_LOCK; + this.suspendResumeLock = configuration.isAllowPoolSuspension() ? new GlobalPoolLock(true) : GlobalPoolLock.FAUX_LOCK; this.catalog = configuration.getCatalog(); this.connectionCustomizer = initializeCustomizer(); diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java index bb52a31b..92aa809b 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java @@ -25,9 +25,9 @@ import java.util.concurrent.Semaphore; * * @author Brett Wooldridge */ -public class GlobalPoolLock +class GlobalPoolLock { - public static final GlobalPoolLock FAUX_LOCK = new GlobalPoolLock(false) { + static final GlobalPoolLock FAUX_LOCK = new GlobalPoolLock(false) { @Override public void acquire() {} @@ -41,15 +41,13 @@ public class GlobalPoolLock public void resume() {} }; - public static final GlobalPoolLock SUSPEND_RESUME_LOCK = new GlobalPoolLock(true); - private static final int MAX_PERMITS = 10000; private final Semaphore acquisitionSemaphore; /** * Default constructor */ - private GlobalPoolLock(final boolean createSemaphore) { + GlobalPoolLock(final boolean createSemaphore) { acquisitionSemaphore = (createSemaphore ? new Semaphore(MAX_PERMITS, true) : null); } From 4c89007aaddb65c8b0316f64a2683ee209eaa3d4 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 5 Mar 2015 23:00:23 +0900 Subject: [PATCH 07/40] Modernize dependencies. --- hikaricp-java6/pom.xml | 4 ++-- hikaricp/pom.xml | 4 ++-- pom.xml | 33 ++++++++++++++++++++++----------- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/hikaricp-java6/pom.xml b/hikaricp-java6/pom.xml index 90a0010d..7473a51b 100644 --- a/hikaricp-java6/pom.xml +++ b/hikaricp-java6/pom.xml @@ -40,8 +40,8 @@ UTF-8 - 2.4.0 - 4.2.1 + 2.5.3 + 4.6.0 diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index 1586ae93..d57e414d 100644 --- a/hikaricp/pom.xml +++ b/hikaricp/pom.xml @@ -40,8 +40,8 @@ UTF-8 - 2.4.0 - 4.2.1 + 4.6.0 + 2.5.3 diff --git a/pom.xml b/pom.xml index 2128f6b8..02478307 100644 --- a/pom.xml +++ b/pom.xml @@ -40,9 +40,15 @@ UTF-8 - 4.2.1 - 3.4.0 - 1.6.0 + 4.6.0 + 4.3.8.Final + 3.19.0-GA + 0.11.4.1 + 3.1.0 + 1.10.19 + 4.4.0 + 2.3.0 + 1.7.10 @@ -60,55 +66,60 @@ org.slf4j slf4j-api - 1.7.5 + ${slf4j.version} org.slf4j slf4j-simple - 1.7.5 + ${slf4j.version} true org.mockito mockito-all - 1.9.5 + ${mockito.version} test org.javassist javassist - 3.19.0-GA + ${javassist.version} compile org.hibernate hibernate-core - 4.3.0.Final + ${hibernate.version} provided true io.dropwizard.metrics metrics-core - 3.1.0 + ${metrics.version} provided true io.dropwizard.metrics metrics-healthchecks - 3.1.0 + ${metrics.version} provided true simple-jndi simple-jndi - 0.11.4.1 + ${jndi.version} test + + javax.inject + javax.inject + 1 + org.apache.felix org.apache.felix.framework From 38e4ac8deeaad891e9561b6f1d73553e16992802 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 5 Mar 2015 23:35:26 +0900 Subject: [PATCH 08/40] Revert pax exam for java 6 compatibility --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 02478307..24818c3d 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ 0.11.4.1 3.1.0 1.10.19 - 4.4.0 + 3.4.0 2.3.0 1.7.10 From f82a5afe2da1fbfc49c7f1023fffca67d09356c1 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 14 Mar 2015 20:39:20 +0900 Subject: [PATCH 09/40] Fixes #280 make logger non-static and use getClass() --- .../src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java | 2 +- 1 file changed, 1 insertion(+), 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 91b88a58..de32512a 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.LeakTask; */ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListener { - protected static final Logger LOGGER = LoggerFactory.getLogger("HikariPool"); + protected final Logger LOGGER = LoggerFactory.getLogger(getClass()); private static final long ALIVE_BYPASS_WINDOW = Long.getLong("com.zaxxer.hikari.aliveBypassWindow", 1000L); protected static final int POOL_RUNNING = 0; From d3bff837b7d635611333313ac4d107321b29ea74 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Mon, 16 Mar 2015 22:42:57 +0900 Subject: [PATCH 10/40] Remove connectionInitSql deprecation. --- .../main/java/com/zaxxer/hikari/AbstractHikariConfig.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 a92e36e5..d48b47fa 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java @@ -239,7 +239,6 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean * * @return the SQL to execute on new connections, or null */ - @Deprecated public String getConnectionInitSql() { return connectionInitSql; @@ -252,11 +251,9 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean * * @param connectionInitSql the SQL to execute on new connections */ - @Deprecated public void setConnectionInitSql(String connectionInitSql) { this.connectionInitSql = connectionInitSql; - LOGGER.warn("The connectionInitSql property has been deprecated and may be removed in a future release"); } /** {@inheritDoc} */ @@ -540,7 +537,7 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean if (healthCheckRegistry instanceof String) { try { InitialContext initCtx = new InitialContext(); - healthCheckRegistry = (MetricRegistry) initCtx.lookup((String) healthCheckRegistry); + healthCheckRegistry = (HealthCheckRegistry) initCtx.lookup((String) healthCheckRegistry); } catch (NamingException e) { throw new IllegalArgumentException(e); From 0e242affc073e046b79c18fe891a07ea9759ca78 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Mon, 16 Mar 2015 22:45:08 +0900 Subject: [PATCH 11/40] Fixes #279 allow Dropwizard MetricTracker and HealthCheckTracker to be set after pool startup (one time). --- .../com/zaxxer/hikari/HikariDataSource.java | 36 +++++++++++++++++++ .../zaxxer/hikari/pool/BaseHikariPool.java | 26 +++++++++++--- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariDataSource.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariDataSource.java index 956719f4..6a6b3f59 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariDataSource.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariDataSource.java @@ -29,6 +29,8 @@ import javax.sql.DataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.health.HealthCheckRegistry; import com.zaxxer.hikari.pool.HikariPool; import com.zaxxer.hikari.proxy.IHikariConnectionProxy; import com.zaxxer.hikari.util.DriverDataSource; @@ -217,6 +219,40 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea return false; } + /** {@inheritDoc} */ + @Override + public void setMetricRegistry(Object metricRegistry) + { + boolean isAlreadySet = getMetricRegistry() != null; + super.setMetricRegistry(metricRegistry); + + if (fastPathPool != null || pool != null) { + if (isAlreadySet) { + throw new IllegalStateException("MetricRegistry can only be set one time"); + } + else { + pool.setMetricRegistry((MetricRegistry) super.getMetricRegistry()); + } + } + } + + /** {@inheritDoc} */ + @Override + public void setHealthCheckRegistry(Object healthCheckRegistry) + { + boolean isAlreadySet = getHealthCheckRegistry() != null; + super.setHealthCheckRegistry(healthCheckRegistry); + + if (fastPathPool != null || pool != null) { + if (isAlreadySet) { + throw new IllegalStateException("HealthCheckRegistry can only be set one time"); + } + else { + pool.setHealthCheckRegistry((HealthCheckRegistry) super.getHealthCheckRegistry()); + } + } + } + /** * Evict a connection from the pool. Use caution using this method, if you * evict the same connection more than one time, the internal pool accounting 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 de32512a..298f3482 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 @@ -96,14 +96,15 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen private final LeakTask leakTask; private final DataSource dataSource; - private final MetricsTracker metricsTracker; private final GlobalPoolLock suspendResumeLock; private final IConnectionCustomizer connectionCustomizer; private final AtomicReference lastConnectionFailure; private final String username; private final String password; - private final boolean isRecordMetrics; + + private volatile MetricsTracker metricsTracker; + private volatile boolean isRecordMetrics; /** * Construct a HikariPool with the specified configuration. @@ -147,8 +148,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen this.isIsolateInternalQueries = configuration.isIsolateInternalQueries(); this.isUseJdbc4Validation = configuration.getConnectionTestQuery() == null; - this.isRecordMetrics = configuration.getMetricRegistry() != null; - this.metricsTracker = (isRecordMetrics ? new CodaHaleMetricsTracker(this, (MetricRegistry) configuration.getMetricRegistry()) : new MetricsTracker(this)); + setMetricRegistry((MetricRegistry) configuration.getMetricRegistry()); this.dataSource = poolUtils.initializeDataSource(configuration.getDataSourceClassName(), configuration.getDataSource(), configuration.getDataSourceProperties(), configuration.getJdbcUrl(), username, password); @@ -163,7 +163,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen this.leakTask = (configuration.getLeakDetectionThreshold() == 0) ? LeakTask.NO_LEAK : new LeakTask(configuration.getLeakDetectionThreshold(), houseKeepingExecutorService); if (configuration.getHealthCheckRegistry() != null) { - CodahaleHealthChecker.registerHealthChecks(this, (HealthCheckRegistry) configuration.getHealthCheckRegistry()); + setHealthCheckRegistry((HealthCheckRegistry) configuration.getHealthCheckRegistry()); } setRemoveOnCancelPolicy(houseKeepingExecutorService); @@ -380,6 +380,22 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen } } + public void setMetricRegistry(MetricRegistry metricRegistry) + { + this.isRecordMetrics = metricRegistry != null; + if (isRecordMetrics) { + this.metricsTracker = new CodaHaleMetricsTracker(this, metricRegistry); + } + else { + this.metricsTracker = new MetricsTracker(this); + } + } + + public void setHealthCheckRegistry(HealthCheckRegistry healthCheckRegistry) + { + CodahaleHealthChecker.registerHealthChecks(this, healthCheckRegistry); + } + // *********************************************************************** // Protected methods // *********************************************************************** From 718b9b5c9d1f8c7464396e4f2ef5e5c7865505eb Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Mon, 16 Mar 2015 22:50:42 +0900 Subject: [PATCH 12/40] Update CHANGES --- CHANGES | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGES b/CHANGES index f021e26b..4a44c63b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,21 @@ HikariCP Changes +Changes in 2.3.4 + + * Fix class cast exception when setting the HealthCheckRegistry via JNDI lookup. + + * Allow Dropwizard MetricRegistry/HealthCheckRegistry to be set after pool startup -- + one time only. + + * Make logger in BaseHikariPool non-static and use getClass() to log messages as the + implementation class rather than as BaseHikariPool. + + * Remove deprecation from connectionInitSql, it will be allowed. + + * Make suspect/resume lock non-static (should be be shared across pools). + + * Improve unwrap() behavior in the Hibernate HikariConnectionProvider. + Changes in 2.3.3 * Fixed bad interaction with PostgeSQL JDBC driver whereby a SQLException thrown by From 46b758902699821724a7e0b3c72e2a2f64d594c6 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 20 Mar 2015 11:38:06 +0900 Subject: [PATCH 13/40] Improve leak logging --- .../com/zaxxer/hikari/pool/BaseHikariPool.java | 2 +- .../com/zaxxer/hikari/proxy/ConnectionProxy.java | 6 +++--- .../java/com/zaxxer/hikari/util/LeakTask.java | 15 +++++++++------ 3 files changed, 13 insertions(+), 10 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 298f3482..b3076097 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 @@ -212,7 +212,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen else { metricsContext.setConnectionLastOpen(bagEntry, now); metricsContext.stop(); - return ProxyFactory.getProxyConnection((HikariPool) this, bagEntry, leakTask.start()); + return ProxyFactory.getProxyConnection((HikariPool) this, bagEntry, leakTask.start(bagEntry.connection)); } } while (timeout > 0L); 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 68318113..2593d7a5 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 @@ -106,10 +106,10 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy boolean isForceClose = sqlState.startsWith("08") | SQL_ERRORS.contains(sqlState); if (isForceClose) { bagEntry.evicted = true; - LOGGER.warn(String.format("Connection %s (%s) marked as broken because of SQLSTATE(%s), ErrorCode(%d).", delegate.toString(), - parentPool.toString(), sqlState, sqle.getErrorCode()), sqle); + LOGGER.warn("Connection {} ({}) marked as broken because of SQLSTATE({}), ErrorCode({}).", delegate.toString(), + parentPool.toString(), sqlState, sqle.getErrorCode(), sqle); } - else if (sqle.getNextException() instanceof SQLException && sqle != sqle.getNextException()) { + else if (sqle.getNextException() != null && sqle != sqle.getNextException()) { checkException(sqle.getNextException()); } } diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/LeakTask.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/util/LeakTask.java index 9b886b02..3eb14926 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/LeakTask.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/util/LeakTask.java @@ -16,6 +16,7 @@ package com.zaxxer.hikari.util; +import java.sql.Connection; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -37,6 +38,7 @@ public class LeakTask implements Runnable private ScheduledExecutorService executorService; private long leakDetectionThreshold; private ScheduledFuture scheduledFuture; + private Connection connection; private Exception exception; static @@ -46,7 +48,7 @@ public class LeakTask implements Runnable public void cancel() {}; @Override - public LeakTask start() + public LeakTask start(final Connection connection) { return this; } @@ -63,15 +65,16 @@ public class LeakTask implements Runnable { } - private LeakTask(final LeakTask parent) + private LeakTask(final LeakTask parent, final Connection connection) { - exception = new Exception("Apparent connection leak detected"); + this.exception = new Exception("Apparent connection leak detected"); + this.connection = connection; scheduledFuture = parent.executorService.schedule(this, parent.leakDetectionThreshold, TimeUnit.MILLISECONDS); } - public LeakTask start() + public LeakTask start(final Connection connection) { - return new LeakTask(this); + return new LeakTask(this, connection); } /** {@inheritDoc} */ @@ -83,7 +86,7 @@ public class LeakTask implements Runnable System.arraycopy(stackTrace, 3, trace, 0, trace.length); exception.setStackTrace(trace); - LOGGER.warn("Connection leak detection triggered, stack trace follows", exception); + LOGGER.warn("Connection leak detection triggered for connection {}, stack trace follows", connection.toString(), exception); } public void cancel() From 338d5564798025bf6591f7a5e27cdf32a3e79f2b Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 20 Mar 2015 11:48:35 +0900 Subject: [PATCH 14/40] Update CHANGES --- CHANGES | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 4a44c63b..d9c82ed6 100644 --- a/CHANGES +++ b/CHANGES @@ -2,7 +2,7 @@ HikariCP Changes Changes in 2.3.4 - * Fix class cast exception when setting the HealthCheckRegistry via JNDI lookup. + * Fixed class cast exception when setting the HealthCheckRegistry via JNDI lookup. * Allow Dropwizard MetricRegistry/HealthCheckRegistry to be set after pool startup -- one time only. @@ -10,11 +10,13 @@ Changes in 2.3.4 * Make logger in BaseHikariPool non-static and use getClass() to log messages as the implementation class rather than as BaseHikariPool. - * Remove deprecation from connectionInitSql, it will be allowed. + * Removed deprecation from connectionInitSql, it will be allowed. - * Make suspect/resume lock non-static (should be be shared across pools). + * Made suspect/resume lock non-static (should be be shared across pools). - * Improve unwrap() behavior in the Hibernate HikariConnectionProvider. + * Improved unwrap() behavior in the Hibernate HikariConnectionProvider. + + * Improved leak detection log Changes in 2.3.3 From 3ca1d0b3f1fd173370521f5b39a1956679d67cda Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 20 Mar 2015 11:54:58 +0900 Subject: [PATCH 15/40] Fix #285 ensure all properties are Strings when passed to driver's connect method --- .../main/java/com/zaxxer/hikari/util/DriverDataSource.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 3f44a469..fbbacd60 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 @@ -21,6 +21,7 @@ import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; +import java.util.Map.Entry; import java.util.Properties; import javax.sql.DataSource; @@ -36,7 +37,11 @@ public final class DriverDataSource implements DataSource try { this.jdbcUrl = jdbcUrl; this.driverProperties = new Properties(); - this.driverProperties.putAll(properties); + + for (Entry entry : properties.entrySet()) { + driverProperties.setProperty(entry.getKey().toString(), entry.getValue().toString()); + } + if (username != null) { driverProperties.put("user", driverProperties.getProperty("user", username)); } From 538546e630c2b6fe723259803db98cb42ea4eb0d Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 20 Mar 2015 11:55:20 +0900 Subject: [PATCH 16/40] Move LeakTask into pool package --- .../com/zaxxer/hikari/pool/BaseHikariPool.java | 3 +-- .../zaxxer/hikari/{util => pool}/LeakTask.java | 17 ++++++++--------- .../zaxxer/hikari/proxy/ConnectionProxy.java | 2 +- .../com/zaxxer/hikari/proxy/ProxyFactory.java | 2 +- .../test/java/com/zaxxer/hikari/MiscTest.java | 2 +- 5 files changed, 12 insertions(+), 14 deletions(-) rename hikaricp-common/src/main/java/com/zaxxer/hikari/{util => pool}/LeakTask.java (85%) 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 b3076097..f67fe622 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 @@ -57,7 +57,6 @@ import com.zaxxer.hikari.proxy.ProxyFactory; import com.zaxxer.hikari.util.ConcurrentBag; import com.zaxxer.hikari.util.DefaultThreadFactory; import com.zaxxer.hikari.util.IBagStateListener; -import com.zaxxer.hikari.util.LeakTask; /** * This is the primary connection pool class that provides the basic @@ -212,7 +211,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen else { metricsContext.setConnectionLastOpen(bagEntry, now); metricsContext.stop(); - return ProxyFactory.getProxyConnection((HikariPool) this, bagEntry, leakTask.start(bagEntry.connection)); + return ProxyFactory.getProxyConnection((HikariPool) this, bagEntry, leakTask.start(bagEntry)); } } while (timeout > 0L); diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/LeakTask.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java similarity index 85% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/LeakTask.java rename to hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java index 3eb14926..53b1304e 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/LeakTask.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java @@ -14,9 +14,8 @@ * limitations under the License. */ -package com.zaxxer.hikari.util; +package com.zaxxer.hikari.pool; -import java.sql.Connection; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -38,7 +37,7 @@ public class LeakTask implements Runnable private ScheduledExecutorService executorService; private long leakDetectionThreshold; private ScheduledFuture scheduledFuture; - private Connection connection; + private PoolBagEntry bagEntry; private Exception exception; static @@ -48,7 +47,7 @@ public class LeakTask implements Runnable public void cancel() {}; @Override - public LeakTask start(final Connection connection) + public LeakTask start(final PoolBagEntry bagEntry) { return this; } @@ -65,16 +64,16 @@ public class LeakTask implements Runnable { } - private LeakTask(final LeakTask parent, final Connection connection) + private LeakTask(final LeakTask parent, final PoolBagEntry bagEntry) { this.exception = new Exception("Apparent connection leak detected"); - this.connection = connection; + this.bagEntry = bagEntry; scheduledFuture = parent.executorService.schedule(this, parent.leakDetectionThreshold, TimeUnit.MILLISECONDS); } - public LeakTask start(final Connection connection) + public LeakTask start(final PoolBagEntry bagEntry) { - return new LeakTask(this, connection); + return new LeakTask(this, bagEntry); } /** {@inheritDoc} */ @@ -86,7 +85,7 @@ public class LeakTask implements Runnable System.arraycopy(stackTrace, 3, trace, 0, trace.length); exception.setStackTrace(trace); - LOGGER.warn("Connection leak detection triggered for connection {}, stack trace follows", connection.toString(), exception); + LOGGER.warn("Connection leak detection triggered for connection {}, stack trace follows", bagEntry.connection.toString(), exception); } public void cancel() 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 2593d7a5..8c53a102 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 @@ -30,9 +30,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.zaxxer.hikari.pool.HikariPool; +import com.zaxxer.hikari.pool.LeakTask; import com.zaxxer.hikari.pool.PoolBagEntry; import com.zaxxer.hikari.util.FastList; -import com.zaxxer.hikari.util.LeakTask; /** * This is the proxy class for java.sql.Connection. diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java index 4f6f2bbe..c5ac541c 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java @@ -23,8 +23,8 @@ import java.sql.ResultSet; import java.sql.Statement; import com.zaxxer.hikari.pool.HikariPool; +import com.zaxxer.hikari.pool.LeakTask; import com.zaxxer.hikari.pool.PoolBagEntry; -import com.zaxxer.hikari.util.LeakTask; /** * A factory class that produces proxies around instances of the standard diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java b/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java index e8f7db4d..46632eae 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java +++ b/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java @@ -29,7 +29,7 @@ import org.junit.Test; import org.slf4j.spi.LocationAwareLogger; import com.zaxxer.hikari.pool.HikariPool; -import com.zaxxer.hikari.util.LeakTask; +import com.zaxxer.hikari.pool.LeakTask; import com.zaxxer.hikari.util.UtilityElf; /** From e68bb6e833c3972561d30964307ef65b670f0584 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 20 Mar 2015 12:25:46 +0900 Subject: [PATCH 17/40] Adjust the leak task stacktrace to eliminate HikariCP from the leak stacktrace. --- .../src/main/java/com/zaxxer/hikari/pool/LeakTask.java | 4 ++-- hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java index 53b1304e..445cd505 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java @@ -81,8 +81,8 @@ public class LeakTask implements Runnable public void run() { final StackTraceElement[] stackTrace = exception.getStackTrace(); - final StackTraceElement[] trace = new StackTraceElement[stackTrace.length - 3]; - System.arraycopy(stackTrace, 3, trace, 0, trace.length); + final StackTraceElement[] trace = new StackTraceElement[stackTrace.length - 5]; + System.arraycopy(stackTrace, 5, trace, 0, trace.length); exception.setStackTrace(trace); LOGGER.warn("Connection leak detection triggered for connection {}, stack trace follows", bagEntry.connection.toString(), exception); diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java b/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java index 46632eae..87c78a34 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java +++ b/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java @@ -114,7 +114,7 @@ public class MiscTest ps.close(); String s = new String(baos.toByteArray()); Assert.assertNotNull("Exception string was null", s); - Assert.assertTrue("Expected exception to contain 'Connection leak detection' but contains *" + s + "*", s.contains("Connection leak detection")); + Assert.assertTrue("Expected exception to contain 'Apparent connection leak detected' but contains *" + s + "*", s.contains("Apparent connection leak detected")); } finally { From 7f574415f27c1f01e544db17fdae50dc6ec5595c Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 20 Mar 2015 12:33:21 +0900 Subject: [PATCH 18/40] [maven-release-plugin] prepare release HikariCP-2.3.4 --- 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 7473a51b..866ec586 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.4 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.4-SNAPSHOT + 2.3.4 diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index d57e414d..9bc9e24e 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.4 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.4-SNAPSHOT + 2.3.4 diff --git a/pom.xml b/pom.xml index 24818c3d..5d067aeb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.4-SNAPSHOT + 2.3.4 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.4 From d3cfa6cc31d25e0267f568a8338db6c0f6b23cc0 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 20 Mar 2015 12:33:28 +0900 Subject: [PATCH 19/40] [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 866ec586..8d3fdedd 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.4 + HikariCP-2.3.2 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.4 + 2.3.5-SNAPSHOT diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index 9bc9e24e..f0d32854 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.4 + HikariCP-2.3.2 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.4 + 2.3.5-SNAPSHOT diff --git a/pom.xml b/pom.xml index 5d067aeb..f47f5e63 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.4 + 2.3.5-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.4 + HikariCP-2.3.2 From b6a3f3d346b903522547af4dff414a63969b72c0 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 20 Mar 2015 16:33:02 +0900 Subject: [PATCH 20/40] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ecd2c8a4..2b2f2dad 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ _Java 8 maven artifact:_ com.zaxxer HikariCP - 2.3.2 + 2.3.4 compile ``` @@ -22,7 +22,7 @@ _Java 6 and Java 7 maven artifact:_ com.zaxxer HikariCP-java6 - 2.3.2 + 2.3.4 compile ``` From 2cabded7f40be32d169cb2dc6b94af30de1f18f9 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sun, 22 Mar 2015 14:51:48 +0900 Subject: [PATCH 21/40] Fix #286 fix regression in Dropwizard runtime dependency --- .../com/zaxxer/hikari/pool/BaseHikariPool.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 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 f67fe622..cf07dcb2 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 @@ -147,7 +147,8 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen this.isIsolateInternalQueries = configuration.isIsolateInternalQueries(); this.isUseJdbc4Validation = configuration.getConnectionTestQuery() == null; - setMetricRegistry((MetricRegistry) configuration.getMetricRegistry()); + setMetricRegistry(configuration.getMetricRegistry()); + setHealthCheckRegistry(configuration.getHealthCheckRegistry()); this.dataSource = poolUtils.initializeDataSource(configuration.getDataSourceClassName(), configuration.getDataSource(), configuration.getDataSourceProperties(), configuration.getJdbcUrl(), username, password); @@ -161,10 +162,6 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen this.houseKeepingExecutorService.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); this.leakTask = (configuration.getLeakDetectionThreshold() == 0) ? LeakTask.NO_LEAK : new LeakTask(configuration.getLeakDetectionThreshold(), houseKeepingExecutorService); - if (configuration.getHealthCheckRegistry() != null) { - setHealthCheckRegistry((HealthCheckRegistry) configuration.getHealthCheckRegistry()); - } - setRemoveOnCancelPolicy(houseKeepingExecutorService); poolUtils.setLoginTimeout(dataSource, connectionTimeout); registerMBeans(configuration, this); @@ -379,20 +376,22 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen } } - public void setMetricRegistry(MetricRegistry metricRegistry) + public void setMetricRegistry(Object metricRegistry) { this.isRecordMetrics = metricRegistry != null; if (isRecordMetrics) { - this.metricsTracker = new CodaHaleMetricsTracker(this, metricRegistry); + this.metricsTracker = new CodaHaleMetricsTracker(this, (MetricRegistry) metricRegistry); } else { this.metricsTracker = new MetricsTracker(this); } } - public void setHealthCheckRegistry(HealthCheckRegistry healthCheckRegistry) + public void setHealthCheckRegistry(Object healthCheckRegistry) { - CodahaleHealthChecker.registerHealthChecks(this, healthCheckRegistry); + if (healthCheckRegistry != null) { + CodahaleHealthChecker.registerHealthChecks(this, (HealthCheckRegistry) healthCheckRegistry); + } } // *********************************************************************** From 0cbe6de51b1247fe0eab1cf0c3da519d67fdbf09 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sun, 22 Mar 2015 14:54:03 +0900 Subject: [PATCH 22/40] [maven-release-plugin] prepare release HikariCP-2.3.5 --- 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 8d3fdedd..7119d7be 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.5 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.5-SNAPSHOT + 2.3.5 diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index f0d32854..c4f5c770 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.5 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.5-SNAPSHOT + 2.3.5 diff --git a/pom.xml b/pom.xml index f47f5e63..cda4d74f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.5-SNAPSHOT + 2.3.5 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.5 From e6936bf0d23d1bcedb44ac790344c7b5dbfe9234 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sun, 22 Mar 2015 14:54:08 +0900 Subject: [PATCH 23/40] [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 7119d7be..800ba3bd 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.5 + HikariCP-2.3.2 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.5 + 2.3.6-SNAPSHOT diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index c4f5c770..6cf6570b 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.5 + HikariCP-2.3.2 @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.5 + 2.3.6-SNAPSHOT diff --git a/pom.xml b/pom.xml index cda4d74f..49c08f52 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.5 + 2.3.6-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.5 + HikariCP-2.3.2 From 3355525e9aa311564270e66ba2cfa5bcbad74e52 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sun, 22 Mar 2015 16:14:51 +0900 Subject: [PATCH 24/40] Update CHANGES --- CHANGES | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES b/CHANGES index d9c82ed6..5ee1e624 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,10 @@ HikariCP Changes +Changes in 2.3.5 + + * Fixed regression caused by enhancement #279 that imposed a runtime dependency on + Dropwizard metrics. + Changes in 2.3.4 * Fixed class cast exception when setting the HealthCheckRegistry via JNDI lookup. From 7ed3d9c4192f660a43e16a7dd1ebf02739a322b1 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sun, 22 Mar 2015 16:16:36 +0900 Subject: [PATCH 25/40] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2b2f2dad..69203b3e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ _Java 8 maven artifact:_ com.zaxxer HikariCP - 2.3.4 + 2.3.5 compile ``` @@ -22,7 +22,7 @@ _Java 6 and Java 7 maven artifact:_ com.zaxxer HikariCP-java6 - 2.3.4 + 2.3.5 compile ``` From 4faae6b8dfa5f96a3b832238f9e3ae23fd296b68 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sun, 22 Mar 2015 16:31:22 +0900 Subject: [PATCH 26/40] Mark scope as 'test' --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 49c08f52..e8faae8f 100644 --- a/pom.xml +++ b/pom.xml @@ -119,6 +119,7 @@ javax.inject javax.inject 1 + test org.apache.felix From 76f80fd51f4aac88283c1a8b39d0e04b5de38d7a Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 24 Mar 2015 00:58:36 +0900 Subject: [PATCH 27/40] Fix #288 allow explicit definition of driverClassName to override DriverManager.getDriver(url) located driver. --- .../zaxxer/hikari/AbstractHikariConfig.java | 5 ++++ .../zaxxer/hikari/pool/BaseHikariPool.java | 2 +- .../com/zaxxer/hikari/pool/PoolUtilities.java | 5 ++-- .../zaxxer/hikari/util/DriverDataSource.java | 25 +++++++++++++++++-- 4 files changed, 32 insertions(+), 5 deletions(-) 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 d48b47fa..5471c835 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java @@ -354,6 +354,11 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean dataSourceProperties.putAll(dsProperties); } + public String getDriverClassName() + { + return driverClassName; + } + public void setDriverClassName(String driverClassName) { try { 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 cf07dcb2..104bda13 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 @@ -150,7 +150,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen setMetricRegistry(configuration.getMetricRegistry()); setHealthCheckRegistry(configuration.getHealthCheckRegistry()); - this.dataSource = poolUtils.initializeDataSource(configuration.getDataSourceClassName(), configuration.getDataSource(), configuration.getDataSourceProperties(), configuration.getJdbcUrl(), username, password); + this.dataSource = poolUtils.initializeDataSource(configuration.getDataSourceClassName(), configuration.getDataSource(), configuration.getDataSourceProperties(), configuration.getDriverClassName(), configuration.getJdbcUrl(), username, password); this.addConnectionExecutor = createThreadPoolExecutor(configuration.getMaximumPoolSize(), "HikariCP connection filler (pool " + configuration.getPoolName() + ")", configuration.getThreadFactory(), new ThreadPoolExecutor.DiscardPolicy()); this.closeConnectionExecutor = createThreadPoolExecutor(4, "HikariCP connection closer (pool " + configuration.getPoolName() + ")", configuration.getThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); 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 2007b893..5194d211 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 @@ -90,12 +90,13 @@ public final class PoolUtilities * @param dsClassName a DataSource class name (optional) * @param dataSource a DataSource instance (optional) * @param dataSourceProperties a Properties instance of DataSource properties + * @param driverClassName the JDBC driver class name (optional) * @param jdbcUrl a JDBC connection URL (optional) * @param username a username (optional) * @param password a password (optional) * @return a DataSource instance */ - public DataSource initializeDataSource(final String dsClassName, DataSource dataSource, final Properties dataSourceProperties, final String jdbcUrl, final String username, final String password) + public DataSource initializeDataSource(final String dsClassName, DataSource dataSource, final Properties dataSourceProperties, final String driverClassName, final String jdbcUrl, final String username, final String password) { try { if (dataSource == null && dsClassName != null) { @@ -104,7 +105,7 @@ public final class PoolUtilities return dataSource; } else if (jdbcUrl != null) { - return new DriverDataSource(jdbcUrl, dataSourceProperties, username, password); + return new DriverDataSource(jdbcUrl, driverClassName, dataSourceProperties, username, password); } return dataSource; 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 fbbacd60..6e43948f 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 @@ -21,6 +21,7 @@ import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; +import java.util.Enumeration; import java.util.Map.Entry; import java.util.Properties; @@ -32,7 +33,7 @@ public final class DriverDataSource implements DataSource private final Properties driverProperties; private final Driver driver; - public DriverDataSource(String jdbcUrl, Properties properties, String username, String password) + public DriverDataSource(String jdbcUrl, String driverClassName, Properties properties, String username, String password) { try { this.jdbcUrl = jdbcUrl; @@ -49,7 +50,27 @@ public final class DriverDataSource implements DataSource driverProperties.put("password", driverProperties.getProperty("password", password)); } - driver = DriverManager.getDriver(jdbcUrl); + if (driverClassName != null) { + Driver matched = null; + Enumeration drivers = DriverManager.getDrivers(); + while (drivers.hasMoreElements()) { + Driver d = drivers.nextElement(); + if (d.getClass().getName().equals(driverClassName)) { + matched = d; + break; + } + } + + if (matched != null) { + driver = matched; + } + else { + throw new IllegalArgumentException("Driver with class name " + driverClassName + " was not found among registered drivers"); + } + } + else { + driver = DriverManager.getDriver(jdbcUrl); + } } catch (SQLException e) { throw new RuntimeException("Unable to get driver for JDBC URL " + jdbcUrl, e); From c457ca060b035439d5d5dc77fd57562ae632c836 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 27 Mar 2015 14:44:39 +0900 Subject: [PATCH 28/40] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69203b3e..01a2e764 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)](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://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)](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. ========== 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 ded61125fee00a3ed1ed07de13810375184d7a5e Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 00:50:46 +0900 Subject: [PATCH 29/40] Recombine into a single Java 7 compatible build. --- hikaricp-common/pom.xml | 18 - .../zaxxer/hikari/IConnectionCustomizer.java | 41 -- hikaricp-java6/pom.xml | 261 ------------- .../java/com/zaxxer/hikari/HikariConfig.java | 87 ----- .../com/zaxxer/hikari/pool/HikariPool.java | 252 ------------- .../hikari/proxy/JavassistProxyFactory.java | 270 -------------- .../hikari/util/Java6ConcurrentBag.java | 132 ------- .../main/resources/META-INF/codex.properties | 210 ----------- .../zaxxer/hikari/osgi/OSGiBundleTest.java | 91 ----- .../src/test/resources/hibernate.properties | 4 - .../src/test/resources/propfile1.properties | 4 - .../src/test/resources/propfile2.properties | 5 - .../src/test/resources/propfile3.properties | 6 - hikaricp/pom.xml | 353 ------------------ .../java/com/zaxxer/hikari/HikariConfig.java | 81 ---- .../com/zaxxer/hikari/pool/HikariPool.java | 227 ----------- .../hikari/util/Java8ConcurrentBag.java | 119 ------ pom.xml | 118 +++++- .../java/com/zaxxer/hikari/HikariConfig.java | 97 ++--- .../com/zaxxer/hikari/HikariConfigMBean.java | 0 .../com/zaxxer/hikari/HikariDataSource.java | 0 .../com/zaxxer/hikari/HikariJNDIFactory.java | 0 .../hibernate/HikariConfigurationUtil.java | 0 .../hibernate/HikariConnectionProvider.java | 0 .../metrics/CodaHaleMetricsTracker.java | 4 +- .../hikari/metrics/CodahaleHealthChecker.java | 8 +- .../zaxxer/hikari/metrics/MetricsTracker.java | 6 +- .../zaxxer/hikari/pool/GlobalPoolLock.java | 0 .../zaxxer/hikari/pool/HikariMBeanElf.java | 4 +- .../com/zaxxer/hikari/pool/HikariPool.java | 201 +++++++--- .../zaxxer/hikari/pool/HikariPoolMBean.java | 0 .../java/com/zaxxer/hikari/pool/LeakTask.java | 0 .../com/zaxxer/hikari/pool/PoolBagEntry.java | 2 +- .../pool/PoolInitializationException.java | 0 .../com/zaxxer/hikari/pool/PoolUtilities.java | 0 .../hikari/proxy/CallableStatementProxy.java | 0 .../zaxxer/hikari/proxy/ClosedConnection.java | 0 .../zaxxer/hikari/proxy/ConnectionProxy.java | 0 .../hikari/proxy/IHikariConnectionProxy.java | 0 .../hikari/proxy/JavassistProxyFactory.java | 0 .../hikari/proxy/PreparedStatementProxy.java | 0 .../com/zaxxer/hikari/proxy/ProxyFactory.java | 0 .../zaxxer/hikari/proxy/ResultSetProxy.java | 0 .../zaxxer/hikari/proxy/StatementProxy.java | 0 .../zaxxer/hikari/util/ClassLoaderUtils.java | 0 .../com/zaxxer/hikari/util/ConcurrentBag.java | 30 +- .../hikari/util/DefaultThreadFactory.java | 0 .../zaxxer/hikari/util/DriverDataSource.java | 0 .../java/com/zaxxer/hikari/util/FastList.java | 0 .../zaxxer/hikari/util/IBagStateListener.java | 0 .../hikari/util/IConcurrentBagEntry.java | 0 .../hikari/util/PropertyBeanSetter.java | 0 .../com/zaxxer/hikari/util/UtilityElf.java | 27 -- .../zaxxer/hikari/ConnectionStateTest.java | 2 - .../java/com/zaxxer/hikari/ExceptionTest.java | 0 .../java/com/zaxxer/hikari/IsolationTest.java | 0 .../com/zaxxer/hikari/JdbcDriverTest.java | 0 .../test/java/com/zaxxer/hikari/MiscTest.java | 0 .../java/com/zaxxer/hikari/PostgresTest.java | 0 .../java/com/zaxxer/hikari/RampUpDown.java | 0 .../java/com/zaxxer/hikari/ShutdownTest.java | 0 .../java/com/zaxxer/hikari/StatementTest.java | 0 .../com/zaxxer/hikari/TestConcurrentBag.java | 65 +--- .../hikari/TestConnectionCloseBlocking.java | 0 .../hikari/TestConnectionTimeoutRetry.java | 0 .../com/zaxxer/hikari/TestConnections.java | 1 - .../test/java/com/zaxxer/hikari/TestElf.java | 2 +- .../java/com/zaxxer/hikari/TestFastList.java | 0 .../java/com/zaxxer/hikari/TestHibernate.java | 0 .../test/java/com/zaxxer/hikari/TestJNDI.java | 0 .../java/com/zaxxer/hikari/TestMBean.java | 0 .../java/com/zaxxer/hikari/TestMetrics.java | 0 .../com/zaxxer/hikari/TestPropertySetter.java | 0 .../java/com/zaxxer/hikari/TestProxies.java | 0 .../com/zaxxer/hikari/TestValidation.java | 52 --- .../java/com/zaxxer/hikari/UnwrapTest.java | 0 .../zaxxer/hikari/mocks/MockDataSource.java | 0 .../hikari/mocks/StubBaseConnection.java | 0 .../zaxxer/hikari/mocks/StubConnection.java | 0 .../zaxxer/hikari/mocks/StubDataSource.java | 0 .../com/zaxxer/hikari/mocks/StubDriver.java | 0 .../hikari/mocks/StubPreparedStatement.java | 0 .../zaxxer/hikari/mocks/StubResultSet.java | 0 .../zaxxer/hikari/mocks/StubStatement.java | 0 .../zaxxer/hikari/osgi/OSGiBundleTest.java | 0 .../test/resources/hibernate.properties | 0 .../test/resources/propfile1.properties | 0 .../test/resources/propfile2.properties | 0 .../test/resources/propfile3.properties | 0 89 files changed, 323 insertions(+), 2457 deletions(-) delete mode 100644 hikaricp-common/pom.xml delete mode 100644 hikaricp-common/src/main/java/com/zaxxer/hikari/IConnectionCustomizer.java delete mode 100644 hikaricp-java6/pom.xml delete mode 100644 hikaricp-java6/src/main/java/com/zaxxer/hikari/HikariConfig.java delete mode 100644 hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java delete mode 100644 hikaricp-java6/src/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java delete mode 100644 hikaricp-java6/src/main/java/com/zaxxer/hikari/util/Java6ConcurrentBag.java delete mode 100644 hikaricp-java6/src/main/resources/META-INF/codex.properties delete mode 100644 hikaricp-java6/src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java delete mode 100644 hikaricp-java6/src/test/resources/hibernate.properties delete mode 100644 hikaricp-java6/src/test/resources/propfile1.properties delete mode 100644 hikaricp-java6/src/test/resources/propfile2.properties delete mode 100644 hikaricp-java6/src/test/resources/propfile3.properties delete mode 100644 hikaricp/pom.xml delete mode 100644 hikaricp/src/main/java/com/zaxxer/hikari/HikariConfig.java delete mode 100644 hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java delete mode 100644 hikaricp/src/main/java/com/zaxxer/hikari/util/Java8ConcurrentBag.java rename hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java => src/main/java/com/zaxxer/hikari/HikariConfig.java (91%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/HikariConfigMBean.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/HikariDataSource.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/HikariJNDIFactory.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/hibernate/HikariConfigurationUtil.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/metrics/CodaHaleMetricsTracker.java (97%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/metrics/CodahaleHealthChecker.java (94%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java (93%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java (97%) rename hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java => src/main/java/com/zaxxer/hikari/pool/HikariPool.java (78%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/pool/LeakTask.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java (97%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/pool/PoolUtilities.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/proxy/ClosedConnection.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/proxy/IHikariConnectionProxy.java (100%) rename {hikaricp/src => src}/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/proxy/StatementProxy.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/ClassLoaderUtils.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/ConcurrentBag.java (94%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/DefaultThreadFactory.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/DriverDataSource.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/FastList.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/IBagStateListener.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/IConcurrentBagEntry.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java (100%) rename {hikaricp-common/src => src}/main/java/com/zaxxer/hikari/util/UtilityElf.java (86%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/ConnectionStateTest.java (98%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/ExceptionTest.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/IsolationTest.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/JdbcDriverTest.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/MiscTest.java (100%) rename {hikaricp/src => src}/test/java/com/zaxxer/hikari/PostgresTest.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/RampUpDown.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/ShutdownTest.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/StatementTest.java (100%) rename {hikaricp/src => src}/test/java/com/zaxxer/hikari/TestConcurrentBag.java (64%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestConnectionCloseBlocking.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestConnectionTimeoutRetry.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestConnections.java (99%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestElf.java (97%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestFastList.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestHibernate.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestJNDI.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestMBean.java (100%) rename {hikaricp-java6/src => src}/test/java/com/zaxxer/hikari/TestMetrics.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestPropertySetter.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestProxies.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/TestValidation.java (83%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/UnwrapTest.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/mocks/MockDataSource.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/mocks/StubBaseConnection.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/mocks/StubConnection.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/mocks/StubDataSource.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/mocks/StubDriver.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/mocks/StubPreparedStatement.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/mocks/StubResultSet.java (100%) rename {hikaricp-common/src => src}/test/java/com/zaxxer/hikari/mocks/StubStatement.java (100%) rename {hikaricp/src => src}/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java (100%) rename {hikaricp-common/src => src}/test/resources/hibernate.properties (100%) rename {hikaricp-common/src => src}/test/resources/propfile1.properties (100%) rename {hikaricp-common/src => src}/test/resources/propfile2.properties (100%) rename {hikaricp-common/src => src}/test/resources/propfile3.properties (100%) diff --git a/hikaricp-common/pom.xml b/hikaricp-common/pom.xml deleted file mode 100644 index 58b76aa2..00000000 --- a/hikaricp-common/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - 4.0.0 - - HikariCP-common - jar - - hikaricp-common - - - UTF-8 - - - - com.zaxxer - HikariCP-parent - 2.3.4-SNAPSHOT - - \ No newline at end of file diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/IConnectionCustomizer.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/IConnectionCustomizer.java deleted file mode 100644 index 1b33f2a8..00000000 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/IConnectionCustomizer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2013 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.zaxxer.hikari; - -import java.sql.Connection; -import java.sql.SQLException; - -/** - * Interface whose implementers can perform one-time customization of a - * Connection before it is added to the pool. Note the implemention - * of the customize() method must be multithread-safe as - * it may be called by multiple threads at one time. - * - * @author Brett Wooldridge - */ -public interface IConnectionCustomizer -{ - /** - * The Connection object that is passed into this method is the "raw" - * Connection instance provided by the JDBC driver, not a wrapped - * HikariCP connection. - * - * @param connection a native JDBC driver Connection instance to customize - * @throws SQLException should be thrown if an error condition is encountered during customization - */ - void customize(Connection connection) throws SQLException; -} diff --git a/hikaricp-java6/pom.xml b/hikaricp-java6/pom.xml deleted file mode 100644 index 800ba3bd..00000000 --- a/hikaricp-java6/pom.xml +++ /dev/null @@ -1,261 +0,0 @@ - - - 4.0.0 - - - - HikariCP-java6 - bundle - - HikariCP-java6 - Ultimate JDBC Connection Pool - https://github.com/brettwooldridge/HikariCP - - - Zaxxer.com - https://github.com/brettwooldridge - - - - 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 - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - Brett Wooldridge - brett.wooldridge@gmail.com - - - - - UTF-8 - 2.5.3 - 4.6.0 - - - - com.zaxxer - HikariCP-parent - 2.3.6-SNAPSHOT - - - - src/main/java - src/test/java - - - - - org.codehaus.mojo - build-helper-maven-plugin - 1.9.1 - - - src - generate-sources - - add-source - - - - ../hikaricp-common/src/main/java - - - - - test - generate-test-sources - - add-test-source - - - - ../hikaricp-common/src/test/java - - - - - test-resources - generate-test-resources - - add-test-resource - - - - - ../hikaricp-common/src/test/resources - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - true - - 1.6 - 1.6 - - - - - org.apache.felix - maven-bundle-plugin - ${felix.bundle.plugin.version} - true - - - HikariCP-java6 - - com.zaxxer.hikari, - com.zaxxer.hikari.hibernate - - com.zaxxer.hikari.* - <_exportcontents> - com.zaxxer.hikari.pool, - com.zaxxer.hikari.util, - com.zaxxer.hikari.proxy - - - javassist.*, - javax.management, - javax.naming, - javax.naming.spi, - javax.sql, - javax.sql.rowset, - javax.sql.rowset.serial, - javax.sql.rowset.spi, - com.codahale.metrics;resolution:=optional, - com.codahale.metrics.health;resolution:=optional, - org.slf4j;version="[1.6,2)", - org.hibernate;resolution:=optional, - org.hibernate.cfg;resolution:=optional, - org.hibernate.engine.jdbc.connections.spi;resolution:=optional, - org.hibernate.service;resolution:=optional, - org.hibernate.service.spi;resolution:=optional - - ${project.groupId}.${project.artifactId} - * - - - - - - - manifest - - - - - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.5 - - HikariCP-@{project.version} - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - org.apache.felix - - maven-bundle-plugin - - [2.4.0,) - - manifest - - - - - - - - - - - - - - - - - release-sign-artifacts - - - performRelease - true - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.4 - - - sign-artifacts - verify - - sign - - - - - - - - - - felix - - true - - pax.exam.framework - felix - - - - felix - none - - - - org.apache.felix - org.apache.felix.framework - ${felix.version} - test - - - - - diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/HikariConfig.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/HikariConfig.java deleted file mode 100644 index b4fd5839..00000000 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/HikariConfig.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2013, 2014 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.zaxxer.hikari; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -import com.zaxxer.hikari.proxy.JavassistProxyFactory; -import com.zaxxer.hikari.util.PropertyBeanSetter; - -public class HikariConfig extends AbstractHikariConfig -{ - static { - JavassistProxyFactory.initialize(); - } - - /** - * Default constructor - */ - public HikariConfig() - { - super(); - } - - /** - * Construct a HikariConfig from the specified properties object. - * - * @param properties the name of the property file - */ - public HikariConfig(Properties properties) - { - super(properties); - } - - /** - * Construct a HikariConfig from the specified property file name. propertyFileName - * will first be treated as a path in the file-system, and if that fails the - * ClassLoader.getResourceAsStream(propertyFileName) will be tried. - * - * @param propertyFileName the name of the property file - */ - public HikariConfig(String propertyFileName) - { - super(propertyFileName); - } - - protected void loadProperties(String propertyFileName) - { - final File propFile = new File(propertyFileName); - try { - final InputStream is = propFile.isFile() ? new FileInputStream(propFile) : this.getClass().getResourceAsStream(propertyFileName); - if (is != null) { - try { - Properties props = new Properties(); - props.load(is); - PropertyBeanSetter.setTargetFromProperties(this, props); - } - finally { - is.close(); - } - } - else { - throw new IllegalArgumentException("Property file " + propertyFileName + " was not found."); - } - } - catch (IOException io) { - throw new RuntimeException("Error loading properties file", io); - } - } -} 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 deleted file mode 100644 index 827b956c..00000000 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2013,2014 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.zaxxer.hikari.pool; - -import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_IN_USE; -import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_NOT_IN_USE; -import static com.zaxxer.hikari.util.UtilityElf.quietlySleep; - -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.TimeUnit; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.util.ConcurrentBag; -import com.zaxxer.hikari.util.IBagStateListener; -import com.zaxxer.hikari.util.Java6ConcurrentBag; - -/** - * This is the primary connection pool class that provides the basic - * pooling behavior for HikariCP. - * - * @author Brett Wooldridge - */ -public final class HikariPool extends BaseHikariPool -{ - /** - * Construct a HikariPool with the specified configuration. - * - * @param configuration a HikariConfig instance - */ - public HikariPool(HikariConfig configuration) - { - this(configuration, configuration.getUsername(), configuration.getPassword()); - } - - /** - * Construct a HikariPool with the specified configuration. - * - * @param configuration a HikariConfig instance - * @param username authentication username - * @param password authentication password - */ - public HikariPool(HikariConfig configuration, String username, String password) - { - super(configuration, username, password); - } - - // *********************************************************************** - // IBagStateListener callback - // *********************************************************************** - - /** {@inheritDoc} */ - @Override - public void addBagItem() - { - class AddConnection implements Runnable - { - public void run() - { - long sleepBackoff = 200L; - final int maxPoolSize = configuration.getMaximumPoolSize(); - while (poolState == POOL_RUNNING && totalConnections.get() < maxPoolSize && !addConnection()) { - // If we got into the loop, addConnection() failed, so we sleep and retry - quietlySleep(sleepBackoff); - sleepBackoff = Math.min(connectionTimeout / 2, (long) ((double) sleepBackoff * 1.5)); - } - } - } - - addConnectionExecutor.execute(new AddConnection()); - } - - // *********************************************************************** - // HikariPoolMBean methods - // *********************************************************************** - - /** {@inheritDoc} */ - @Override - public void softEvictConnections() - { - for (PoolBagEntry bagEntry : connectionBag.values(STATE_IN_USE)) { - bagEntry.evicted = true; - } - - for (PoolBagEntry bagEntry : connectionBag.values(STATE_NOT_IN_USE)) { - if (connectionBag.reserve(bagEntry)) { - closeConnection(bagEntry); - } - } - } - - // *********************************************************************** - // Protected methods - // *********************************************************************** - - /** - * Permanently close the real (underlying) connection (eat any exception). - * - * @param connectionProxy the connection to actually close - */ - @Override - protected void closeConnection(final PoolBagEntry bagEntry) - { - bagEntry.cancelMaxLifeTermination(); - if (connectionBag.remove(bagEntry)) { - final int tc = totalConnections.decrementAndGet(); - if (tc < 0) { - LOGGER.warn("Internal accounting inconsistency, totalConnections={}", tc, new Exception()); - } - closeConnectionExecutor.execute(new Runnable() { - public void run() { - poolUtils.quietlyCloseConnection(bagEntry.connection); - } - }); - } - } - - /** - * Check whether the connection is alive or not. - * - * @param connection the connection to test - * @param timeoutMs the timeout before we consider the test a failure - * @return true if the connection is alive, false if it is not alive or we timed out - */ - @Override - protected boolean isConnectionAlive(final Connection connection) - { - try { - final int timeoutSec = (int) TimeUnit.MILLISECONDS.toSeconds(validationTimeout); - - if (isUseJdbc4Validation) { - return connection.isValid(timeoutSec); - } - - final int originalTimeout = poolUtils.getAndSetNetworkTimeout(connection, validationTimeout); - - Statement statement = connection.createStatement(); - try { - poolUtils.setQueryTimeout(statement, timeoutSec); - statement.executeQuery(configuration.getConnectionTestQuery()); - } - finally { - statement.close(); - } - - if (isIsolateInternalQueries && !isAutoCommit) { - connection.rollback(); - } - - poolUtils.setNetworkTimeout(connection, originalTimeout); - - return true; - } - catch (SQLException e) { - LOGGER.warn("Exception during keep alive check, that means the connection ({}) must be dead.", connection, e); - return false; - } - } - - /** - * Attempt to abort() active connections on Java7+, or close() them on Java6. - * - * @throws InterruptedException - */ - @Override - protected void abortActiveConnections(final ExecutorService assassinExecutor) throws InterruptedException - { - for (PoolBagEntry bagEntry : connectionBag.values(STATE_IN_USE)) { - try { - bagEntry.aborted = bagEntry.evicted = true; - bagEntry.connection.abort(assassinExecutor); - } - catch (Throwable e) { - if (e instanceof InterruptedException) { - throw (InterruptedException) e; - } - poolUtils.quietlyCloseConnection(bagEntry.connection); - } - finally { - if (connectionBag.remove(bagEntry)) { - totalConnections.decrementAndGet(); - } - } - } - } - - /** {@inheritDoc} */ - @Override - protected Runnable getHouseKeeper() - { - return new HouseKeeper(); - } - - /** {@inheritDoc} */ - @Override - protected ConcurrentBag createConcurrentBag(IBagStateListener listener) - { - return new Java6ConcurrentBag(listener); - } - - // *********************************************************************** - // Non-anonymous Inner-classes - // *********************************************************************** - - /** - * The house keeping task to retire idle connections. - */ - private class HouseKeeper implements Runnable - { - @Override - public void run() - { - logPoolState("Before cleanup "); - - connectionTimeout = configuration.getConnectionTimeout(); // refresh member in case it changed - - final long now = System.currentTimeMillis(); - final long idleTimeout = configuration.getIdleTimeout(); - - for (PoolBagEntry bagEntry : connectionBag.values(STATE_NOT_IN_USE)) { - if (connectionBag.reserve(bagEntry)) { - if (bagEntry.evicted || (idleTimeout > 0L && now > bagEntry.lastAccess + idleTimeout)) { - closeConnection(bagEntry); - } - else { - connectionBag.unreserve(bagEntry); - } - } - } - - logPoolState("After cleanup "); - - fillPool(); // Try to maintain minimum connections - } - } -} diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java deleted file mode 100644 index 89ccf25a..00000000 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (C) 2013, 2014 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.zaxxer.hikari.proxy; - -import java.lang.reflect.Array; -import java.sql.CallableStatement; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javassist.ClassPool; -import javassist.CtClass; -import javassist.CtMethod; -import javassist.CtNewMethod; -import javassist.LoaderClassPath; -import javassist.Modifier; -import javassist.NotFoundException; - -import com.zaxxer.hikari.util.ClassLoaderUtils; - -/** - * This class generates the proxy objects for {@link Connection}, {@link Statement}, - * {@link PreparedStatement}, and {@link CallableStatement}. Additionally it injects - * method bodies into the {@link ProxyFactory} class methods that can instantiate - * instances of the generated proxies. - * - * @author Brett Wooldridge - */ -public final class JavassistProxyFactory -{ - private ClassPool classPool; - - static { - ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - try { - Thread.currentThread().setContextClassLoader(JavassistProxyFactory.class.getClassLoader()); - - JavassistProxyFactory proxyFactoryFactory = new JavassistProxyFactory(); - proxyFactoryFactory.modifyProxyFactory(); - } - catch (Exception e) { - throw new RuntimeException("Fatal exception during proxy generation", e); - } - finally { - Thread.currentThread().setContextClassLoader(contextClassLoader); - } - } - - /** - * Simply invoking this method causes the initialization of this class. All work - * by this class is performed in static initialization. - */ - public static void initialize() - { - // no-op - } - - private JavassistProxyFactory() throws Exception { - classPool = new ClassPool(); - classPool.importPackage("java.sql"); - classPool.appendClassPath(new LoaderClassPath(this.getClass().getClassLoader())); - - // Cast is not needed for these - String methodBody = "{ try { return delegate.method($$); } catch (SQLException e) { throw checkException(e); } }"; - generateProxyClass(Connection.class, ConnectionProxy.class, methodBody); - generateProxyClass(Statement.class, StatementProxy.class, methodBody); - generateProxyClass(ResultSet.class, ResultSetProxy.class, methodBody); - - // For these we have to cast the delegate - methodBody = "{ try { return ((cast) delegate).method($$); } catch (SQLException e) { throw checkException(e); } }"; - generateProxyClass(PreparedStatement.class, PreparedStatementProxy.class, methodBody); - generateProxyClass(CallableStatement.class, CallableStatementProxy.class, methodBody); - } - - private void modifyProxyFactory() throws Exception - { - String packageName = JavassistProxyFactory.class.getPackage().getName(); - CtClass proxyCt = classPool.getCtClass("com.zaxxer.hikari.proxy.ProxyFactory"); - for (CtMethod method : proxyCt.getMethods()) { - String methodName = method.getName(); - if ("getProxyConnection".equals(methodName)) { - method.setBody("{return new " + packageName + ".ConnectionJavassistProxy($$);}"); - } - else if ("getProxyStatement".equals(methodName)) { - method.setBody("{return new " + packageName + ".StatementJavassistProxy($$);}"); - } - else if ("getProxyPreparedStatement".equals(methodName)) { - method.setBody("{return new " + packageName + ".PreparedStatementJavassistProxy($$);}"); - } - else if ("getProxyCallableStatement".equals(methodName)) { - method.setBody("{return new " + packageName + ".CallableStatementJavassistProxy($$);}"); - } - else if ("getProxyResultSet".equals(methodName)) { - method.setBody("{return new " + packageName + ".ResultSetJavassistProxy($$);}"); - } - } - - proxyCt.toClass(classPool.getClassLoader(), getClass().getProtectionDomain()); - } - - /** - * Generate Javassist Proxy Classes - */ - @SuppressWarnings("unchecked") - private Class generateProxyClass(Class primaryInterface, Class superClass, String methodBody) throws Exception - { - // Make a new class that extends one of the JavaProxy classes (ie. superClass); use the name to XxxJavassistProxy instead of XxxProxy - String superClassName = superClass.getName(); - CtClass superClassCt = classPool.getCtClass(superClassName); - CtClass targetCt = classPool.makeClass(superClassName.replace("Proxy", "JavassistProxy"), superClassCt); - targetCt.setModifiers(Modifier.FINAL); - - // Make a set of method signatures we inherit implementation for, so we don't generate delegates for these - Set superSigs = new HashSet(); - for (CtMethod method : superClassCt.getMethods()) { - if ((method.getModifiers() & Modifier.FINAL) == Modifier.FINAL) { - superSigs.add(method.getName() + method.getSignature()); - } - } - - Set methods = new HashSet(); - Set> interfaces = ClassLoaderUtils.getAllInterfaces(primaryInterface); - for (Class intf : interfaces) { - CtClass intfCt = classPool.getCtClass(intf.getName()); - targetCt.addInterface(intfCt); - for (CtMethod intfMethod : intfCt.getDeclaredMethods()) { - final String signature = intfMethod.getName() + intfMethod.getSignature(); - - // don't generate delegates for methods we override - if (superSigs.contains(signature)) { - continue; - } - - // Ignore already added methods that come from other interfaces - if (methods.contains(signature)) { - continue; - } - - // Ignore default methods (only for Jre8 or later) - if (isDefaultMethod(intf, intfCt, intfMethod)) { - continue; - } - - // Track what methods we've added - methods.add(signature); - - // Clone the method we want to inject into - CtMethod method = CtNewMethod.copy(intfMethod, targetCt, null); - - String modifiedBody = methodBody; - - // If the super-Proxy has concrete methods (non-abstract), transform the call into a simple super.method() call - CtMethod superMethod = superClassCt.getMethod(intfMethod.getName(), intfMethod.getSignature()); - if ((superMethod.getModifiers() & Modifier.ABSTRACT) != Modifier.ABSTRACT) { - modifiedBody = modifiedBody.replace("((cast) ", ""); - modifiedBody = modifiedBody.replace("delegate", "super"); - modifiedBody = modifiedBody.replace("super)", "super"); - } - - modifiedBody = modifiedBody.replace("cast", primaryInterface.getName()); - - // Generate a method that simply invokes the same method on the delegate - if (isThrowsSqlException(intfMethod)) { - modifiedBody = modifiedBody.replace("method", method.getName()); - } - else { - modifiedBody = "{ return ((cast) delegate).method($$); }".replace("method", method.getName()).replace("cast", primaryInterface.getName()); - } - - if (method.getReturnType() == CtClass.voidType) { - modifiedBody = modifiedBody.replace("return", ""); - } - - method.setBody(modifiedBody); - targetCt.addMethod(method); - } - } - - return targetCt.toClass(classPool.getClassLoader(), getClass().getProtectionDomain()); - } - - private boolean isThrowsSqlException(CtMethod method) - { - try { - for (CtClass clazz : method.getExceptionTypes()) { - if (clazz.getSimpleName().equals("SQLException")) { - return true; - } - } - } - catch (NotFoundException e) { - // fall thru - } - - return false; - } - - private boolean isDefaultMethod(Class intf, CtClass intfCt, CtMethod intfMethod) throws Exception - { - List> paramTypes = new ArrayList>(); - - for (CtClass pt : intfMethod.getParameterTypes()) { - paramTypes.add(toJavaClass(pt)); - } - - return intf.getDeclaredMethod(intfMethod.getName(), paramTypes.toArray(new Class[0])).toString().contains("default "); - } - - private Class toJavaClass(CtClass cls) throws Exception - { - if (cls.getName().endsWith("[]")) { - return Array.newInstance(toJavaClass(cls.getName().replace("[]", "")), 0).getClass(); - } - else { - return toJavaClass(cls.getName()); - } - } - - private Class toJavaClass(String cn) throws Exception - { - if ("int".equals(cn)) { - return int.class; - } - if ("long".equals(cn)) { - return long.class; - } - if ("short".equals(cn)) { - return short.class; - } - if ("byte".equals(cn)) { - return byte.class; - } - if ("float".equals(cn)) { - return float.class; - } - if ("double".equals(cn)) { - return double.class; - } - if ("boolean".equals(cn)) { - return boolean.class; - } - if ("char".equals(cn)) { - return char.class; - } - if ("void".equals(cn)) { - return void.class; - } - - return Class.forName(cn); - } -} diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/Java6ConcurrentBag.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/Java6ConcurrentBag.java deleted file mode 100644 index 74de51f3..00000000 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/Java6ConcurrentBag.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2013, 2014 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.zaxxer.hikari.util; - -import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_IN_USE; -import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_NOT_IN_USE; -import static com.zaxxer.hikari.util.UtilityElf.IS_JAVA7; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; - -import com.zaxxer.hikari.pool.PoolBagEntry; - -/** - * This is a specialized concurrent bag that achieves superior performance - * to LinkedBlockingQueue and LinkedTransferQueue for the purposes of a - * connection pool. It uses ThreadLocal storage when possible to avoid - * locks, but resorts to scanning a common collection if there are no - * available items in the ThreadLocal list. Not-in-use items in the - * ThreadLocal lists can be "stolen" when the borrowing thread has none - * of its own. It is a "lock-less" implementation using a specialized - * AbstractQueuedLongSynchronizer to manage cross-thread signaling. - * - * Note that items that are "borrowed" from the bag are not actually - * removed from any collection, so garbage collection will not occur - * even if the reference is abandoned. Thus care must be taken to - * "requite" borrowed objects otherwise a memory leak will result. Only - * the "remove" method can completely remove an object from the bag. - * - * @author Brett Wooldridge - * - * @param the templated type to store in the bag - */ -public final class Java6ConcurrentBag extends ConcurrentBag -{ - public Java6ConcurrentBag(IBagStateListener listener) - { - super(listener); - } - - @Override - protected AbstractQueuedLongSynchronizer createQueuedSynchronizer() - { - return new Synchronizer(); - } - - /** - * This method provides a "snaphot" in time of the BagEntry - * items in the bag in the specified state. It does not "lock" - * or reserve items in any way. Call reserve(BagEntry) - * on items in list before performing any action on them. - * - * @param state one of STATE_NOT_IN_USE or STATE_IN_USE - * @return a possibly empty list of objects having the state specified - */ - public List values(final int state) - { - final ArrayList list = new ArrayList(sharedList.size()); - if (state == STATE_IN_USE || state == STATE_NOT_IN_USE) { - for (final PoolBagEntry reference : sharedList) { - if (reference.state.get() == state) { - list.add(reference); - } - } - } - return list; - } - - /** - * Get a count of the number of items in the specified state at the time of this call. - * - * @param state the state of the items to count - * @return a count of how many items in the bag are in the specified state - */ - public int getCount(final int state) - { - int count = 0; - for (final PoolBagEntry reference : sharedList) { - if (reference.state.get() == state) { - count++; - } - } - return count; - } - - - /** - * Our private synchronizer that handles notify/wait type semantics. - */ - private static final class Synchronizer extends AbstractQueuedLongSynchronizer - { - private static final long serialVersionUID = 104753538004341218L; - - @Override - protected long tryAcquireShared(long seq) - { - return getState() > seq && !java67hasQueuedPredecessors() ? 1L : -1L; - } - - /** {@inheritDoc} */ - @Override - protected boolean tryReleaseShared(long updateSeq) - { - setState(updateSeq); - - return true; - } - - private boolean java67hasQueuedPredecessors() - { - if (IS_JAVA7) { - return hasQueuedPredecessors(); - } - - return false; - } - } -} diff --git a/hikaricp-java6/src/main/resources/META-INF/codex.properties b/hikaricp-java6/src/main/resources/META-INF/codex.properties deleted file mode 100644 index 3b3f3d28..00000000 --- a/hikaricp-java6/src/main/resources/META-INF/codex.properties +++ /dev/null @@ -1,210 +0,0 @@ -# This is a manually maintained codex of JDBC drivers and the -# classes within that need to be instrumented. -# - -# ------ HSQLDB v2.3.1 ---------------------------------------------------------- -# -org.hsqldb.jdbc.JDBCDataSource=hsqldb - -hsqldb.baseConnection=org.hsqldb.jdbc.JDBCConnection - -hsqldb.baseStatement=org.hsqldb.jdbc.JDBCStatement - -hsqldb.basePreparedStatement=org.hsqldb.jdbc.JDBCPreparedStatement - -hsqldb.subCallableStatement=org.hsqldb.jdbc.JDBCCallableStatement - -hsqldb.baseResultSet=org.hsqldb.jdbc.JDBCResultSet -hsqldb.subResultSet=org.hsqldb.jdbc.JDBCResultSet$JDBCResultSetBasic - - -# ------ Derby v10.10.1.1 ------------------------------------------------------- -# -org.apache.derby.jdbc.ClientDataSource40=derby - -derby.baseConnection=org.apache.derby.client.am.Connection -derby.subConnection=org.apache.derby.client.net.NetConnection40 - -derby.baseStatement=org.apache.derby.client.am.Statement - -derby.subPreparedStatement=org.apache.derby.client.am.PreparedStatement -derby.subPreparedStatement=org.apache.derby.client.am.PreparedStatement40 -#derby.subPreparedStatement=org.apache.derby.client.am.PreparedStatement42 - -derby.subCallableStatement=org.apache.derby.client.am.CallableStatement -derby.subCallableStatement=org.apache.derby.client.am.CallableStatement40 -#derby.subCallableStatement=org.apache.derby.client.am.CallableStatement42 - -derby.baseResultSet=org.apache.derby.client.am.ResultSet -derby.subResultSet=org.apache.derby.client.net.NetResultSet40 -#derby.subResultSet=org.apache.derby.client.net.NetResultSet42 - -# ------ Derby Embedded v10.10.1.1 ---------------------------------------------- -# - -derby-em.baseConnection=org.apache.derby.impl.jdbc.EmbedConnection -derby-em.baseConnection=org.apache.derby.iapi.jdbc.BrokeredConnection -derby-em.subConnection=org.apache.derby.impl.jdbc.EmbedConnection40 -derby-em.subConnection=org.apache.derby.iapi.jdbc.BrokeredConnection40 -#derby-em.subConnection=org.apache.derby.iapi.jdbc.BrokeredConnection42 - -derby-em.baseStatement=org.apache.derby.impl.jdbc.EmbedStatement -derby-em.baseStatement=org.apache.derby.iapi.jdbc.BrokeredStatement -derby-em.baseStatement=org.apache.derby.client.am.Statement -derby-em.subStatement=org.apache.derby.impl.jdbc.EmbedStatement40 -derby-em.subStatement=org.apache.derby.iapi.jdbc.BrokeredStatement40 - -derby-em.subPreparedStatement=org.apache.derby.impl.jdbc.EmbedPreparedStatement -derby-em.subPreparedStatement=org.apache.derby.impl.jdbc.EmbedPreparedStatement20 -derby-em.subPreparedStatement=org.apache.derby.impl.jdbc.EmbedPreparedStatement30 -derby-em.subPreparedStatement=org.apache.derby.impl.jdbc.EmbedPreparedStatement40 -#derby-em.subPreparedStatement=org.apache.derby.impl.jdbc.EmbedPreparedStatement42 -derby-em.subPreparedStatement=org.apache.derby.iapi.jdbc.BrokeredPreparedStatement -derby-em.subPreparedStatement=org.apache.derby.iapi.jdbc.BrokeredPreparedStatement40 -#derby-em.subPreparedStatement=org.apache.derby.iapi.jdbc.BrokeredPreparedStatement42 -derby-em.subPreparedStatement=org.apache.derby.client.am.PreparedStatement -derby-em.subPreparedStatement=org.apache.derby.client.am.PreparedStatement40 -#derby-em.subPreparedStatement=org.apache.derby.client.am.PreparedStatement42 - -derby-em.subCallableStatement=org.apache.derby.impl.jdbc.EmbedCallableStatement -derby-em.subCallableStatement=org.apache.derby.impl.jdbc.EmbedCallableStatement20 -derby-em.subCallableStatement=org.apache.derby.impl.jdbc.EmbedCallableStatement30 -derby-em.subCallableStatement=org.apache.derby.impl.jdbc.EmbedCallableStatement40 -#derby-em.subCallableStatement=org.apache.derby.impl.jdbc.EmbedCallableStatement42 -derby-em.subCallableStatement=org.apache.derby.iapi.jdbc.BrokeredCallableStatement -derby-em.subCallableStatement=org.apache.derby.iapi.jdbc.BrokeredCallableStatement40 -#derby-em.subCallableStatement=org.apache.derby.iapi.jdbc.BrokeredCallableStatement42 -derby-em.subCallableStatement=org.apache.derby.client.am.CallableStatement -derby-em.subCallableStatement=org.apache.derby.client.am.CallableStatement40 -#derby-em.subCallableStatement=org.apache.derby.client.am.CallableStatement42 - - -# ------ PostgreSQL v9.2-1003.jdbc4 ---------------------------------------------- -# -org.postgresql.ds.PGSimpleDataSource=pgsql - -pgsql.baseConnection=org.postgresql.jdbc2.AbstractJdbc2Connection -pgsql.subConnection=org.postgresql.jdbc3.AbstractJdbc3Connection -pgsql.subConnection=org.postgresql.jdbc3g.AbstractJdbc3gConnection -pgsql.subConnection=org.postgresql.jdbc4.AbstractJdbc4Connection -pgsql.subConnection=org.postgresql.jdbc4.Jdbc4Connection - -pgsql.basePreparedStatement=org.postgresql.jdbc2.AbstractJdbc2Statement - -pgsql.subPreparedStatement=org.postgresql.jdbc3.AbstractJdbc3Statement -pgsql.subPreparedStatement=org.postgresql.jdbc3g.AbstractJdbc3gStatement -pgsql.subPreparedStatement=org.postgresql.jdbc4.AbstractJdbc4Statement -pgsql.subPreparedStatement=org.postgresql.jdbc4.Jdbc4Statement -pgsql.subPreparedStatement=org.postgresql.jdbc4.Jdbc4PreparedStatement - -pgsql.subCallableStatement=org.postgresql.jdbc4.Jdbc4CallableStatement - -pgsql.baseResultSet=org.postgresql.jdbc2.AbstractJdbc2ResultSet -pgsql.subResultSet=org.postgresql.jdbc3.AbstractJdbc3ResultSet -pgsql.subResultSet=org.postgresql.jdbc3g.AbstractJdbc3gResultSet -pgsql.subResultSet=org.postgresql.jdbc4.AbstractJdbc4ResultSet -pgsql.subResultSet=org.postgresql.jdbc4.Jdbc4ResultSet - - -# ------ MySQL Connector/J v5.1.26 ---------------------------------------------- -# -com.mysql.jdbc.jdbc2.optional.MysqlDataSource=mysql - -mysql.baseConnection=com.mysql.jdbc.ConnectionImpl -mysql.baseConnection=com.mysql.jdbc.ReplicationConnection -mysql.baseConnection=com.mysql.jdbc.LoadBalancedMySQLConnection -mysql.subConnection=com.mysql.jdbc.JDBC4Connection -mysql.subConnection=com.mysql.jdbc.JDBC4LoadBalancedMySQLConnection - -mysql.baseStatement=com.mysql.jdbc.StatementImpl - -mysql.subPreparedStatement=com.mysql.jdbc.PreparedStatement -mysql.subPreparedStatement=com.mysql.jdbc.ServerPreparedStatement -mysql.subPreparedStatement=com.mysql.jdbc.JDBC4ServerPreparedStatement - -mysql.subCallableStatement=com.mysql.jdbc.CallableStatement -mysql.subCallableStatement=com.mysql.jdbc.JDBC4CallableStatement - -mysql.baseResultSet=com.mysql.jdbc.ResultSetImpl -mysql.subResultSet=com.mysql.jdbc.JDBC4ResultSet -mysql.subResultSet=com.mysql.jdbc.UpdatableResultSet -mysql.subResultSet=com.mysql.jdbc.JDBC4UpdatableResultSet - -# ------ MariaDB JDBC v1.1.5 -------------------------------------------------- -# -org.mariadb.jdbc.MySQLDataSource=maria - -maria.baseConnection=org.mariadb.jdbc.MySQLConnection - -maria.baseStatement=org.mariadb.jdbc.MySQLStatement - -maria.subPreparedStatement=org.mariadb.jdbc.MySQLPreparedStatement - -maria.baseCallableStatement=org.mariadb.jdbc.MySQLCallableStatement - -maria.baseResultSet=org.mariadb.jdbc.MySQLResultSet - - -# ------ JTDS v1.3.1 ---------------------------------------------------------- -# -net.sourceforge.jtds.jdbcx.JtdsDataSource=jtds - -jtds.baseConnection=net.sourceforge.jtds.jdbc.JtdsConnection -jtds.baseConnection=net.sourceforge.jtds.jdbcx.proxy.ConnectionProxy - -jtds.baseStatement=net.sourceforge.jtds.jdbc.JtdsStatement -jtds.baseStatement=net.sourceforge.jtds.jdbcx.proxy.StatementProxy - -jtds.subPreparedStatement=net.sourceforge.jtds.jdbc.JtdsPreparedStatement -jtds.subPreparedStatement=net.sourceforge.jtds.jdbcx.proxy.PreparedStatementProxy - -jtds.subCallableStatement=net.sourceforge.jtds.jdbc.JtdsCallableStatement -jtds.subCallableStatement=net.sourceforge.jtds.jdbcx.proxy.CallableStatementProxy - -jtds.baseResultSet=net.sourceforge.jtds.jdbc.JtdsResultSet -jtds.subResultSet=net.sourceforge.jtds.jdbc.CachedResultSet -jtds.subResultSet=net.sourceforge.jtds.jdbc.MSCursorResultSet - - -# ------ Oracle v12.1.0.1 ----------------------------------------------------- -# -oracle.jdbc.pool.OracleDataSource=oracle - -oracle.baseConnection=oracle.jdbc.driver.OracleConnection -oracle.subConnection=oracle.jdbc.driver.PhysicalConnection -oracle.subConnection=oracle.jdbc.driver.T4CConnection - -oracle.baseStatement=oracle.jdbc.driver.OracleStatement - -oracle.subPreparedStatement=oracle.jdbc.driver.OraclePreparedStatement - -oracle.subCallableStatement=oracle.jdbc.driver.OracleCallableStatement - -oracle.baseResultSet=oracle.jdbc.driver.OracleResultSet -oracle.subResultSet=oracle.jdbc.driver.ArrayDataResultSet -oracle.subResultSet=oracle.jdbc.driver.GeneratedScrollableResultSet -oracle.subResultSet=oracle.jdbc.driver.InsensitiveScrollableResultSet -oracle.subResultSet=oracle.jdbc.driver.ForwardOnlyResultSet -oracle.subResultSet=oracle.jdbc.driver.ArrayLocatorResultSet -oracle.subResultSet=oracle.jdbc.driver.SensitiveScrollableResultSet -oracle.subResultSet=oracle.jdbc.driver.OracleReturnResultSet -oracle.subResultSet=oracle.jdbc.driver.GeneratedUpdatableResultSet -oracle.subResultSet=oracle.jdbc.driver.UpdatableResultSet - - -# ------ HikariCP Testing v0.0.0 ---------------------------------------------- -# -com.zaxxer.hikari.mocks.StubDataSource=hikari - -hikari.baseConnection=com.zaxxer.hikari.mocks.StubBaseConnection -hikari.subConnection=com.zaxxer.hikari.mocks.StubConnection -hikari.baseStatement=com.zaxxer.hikari.mocks.StubStatement -hikari.subPreparedStatement=com.zaxxer.hikari.mocks.StubPreparedStatement -hikari.baseResultSet=com.zaxxer.hikari.mocks.StubResultSet - -com.zaxxer.hikari.performance.StubDataSource=hikari-perf - -hikari-perf.baseConnection=com.zaxxer.hikari.performance.StubConnection -hikari-perf.baseStatement=com.zaxxer.hikari.performance.StubStatement -hikari-perf.subPreparedStatement=com.zaxxer.hikari.performance.StubPreparedStatement -hikari-perf.baseResultSet=com.zaxxer.hikari.performance.StubResultSet diff --git a/hikaricp-java6/src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java b/hikaricp-java6/src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java deleted file mode 100644 index d90a076e..00000000 --- a/hikaricp-java6/src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2013 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.zaxxer.hikari.osgi; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.ops4j.pax.exam.Configuration; -import org.ops4j.pax.exam.Option; -import org.ops4j.pax.exam.junit.PaxExam; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; - -import javax.inject.Inject; - -import java.io.File; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.ops4j.pax.exam.CoreOptions.*; - -/** - * @author lburgazzoli - */ -@RunWith(PaxExam.class) -public class OSGiBundleTest -{ - @Inject - BundleContext context; - - @Configuration - public Option[] config() - { - return options( - systemProperty("org.osgi.framework.storage.clean").value("true"), - systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("WARN"), - mavenBundle("org.slf4j","slf4j-api","1.7.5"), - mavenBundle("org.slf4j","slf4j-simple","1.7.5").noStart(), - mavenBundle("org.javassist", "javassist", "3.19.0-GA"), - new File("target/classes").exists() - ? bundle("reference:file:target/classes") - : bundle("reference:file:../target/classes"), - junitBundles(), - cleanCaches() - ); - } - - @Test - public void checkInject() - { - assertNotNull(context); - } - - @Test - public void checkBundle() - { - Boolean bundleFound = false; - Boolean bundleActive = false; - - Bundle[] bundles = context.getBundles(); - for(Bundle bundle : bundles) - { - if(bundle != null) - { - if(bundle.getSymbolicName().equals("com.zaxxer.HikariCP-java6")) - { - bundleFound = true; - if(bundle.getState() == Bundle.ACTIVE) - { - bundleActive = true; - } - } - } - } - - assertTrue(bundleFound); - assertTrue(bundleActive); - } -} diff --git a/hikaricp-java6/src/test/resources/hibernate.properties b/hikaricp-java6/src/test/resources/hibernate.properties deleted file mode 100644 index 6d7ebd9a..00000000 --- a/hikaricp-java6/src/test/resources/hibernate.properties +++ /dev/null @@ -1,4 +0,0 @@ -hibernate.hikari.minimumIdle=5 -hibernate.hikari.connectionTestQuery=SELECT 1 -hibernate.hikari.dataSourceClassName=com.zaxxer.hikari.mocks.StubDataSource -hibernate.connection.autocommit=false diff --git a/hikaricp-java6/src/test/resources/propfile1.properties b/hikaricp-java6/src/test/resources/propfile1.properties deleted file mode 100644 index bf00bdde..00000000 --- a/hikaricp-java6/src/test/resources/propfile1.properties +++ /dev/null @@ -1,4 +0,0 @@ -minimumIdle=5 -connectionTestQuery=SELECT 1 -autoCommit=false -dataSourceClassName=com.zaxxer.hikari.mocks.StubDataSource diff --git a/hikaricp-java6/src/test/resources/propfile2.properties b/hikaricp-java6/src/test/resources/propfile2.properties deleted file mode 100644 index 94c7aa4f..00000000 --- a/hikaricp-java6/src/test/resources/propfile2.properties +++ /dev/null @@ -1,5 +0,0 @@ -connectionTestQuery=SELECT 1 -autoCommit=false -dataSourceClassName=com.zaxxer.hikari.mocks.StubDataSource -dataSource.user=test -dataSource.password=test \ No newline at end of file diff --git a/hikaricp-java6/src/test/resources/propfile3.properties b/hikaricp-java6/src/test/resources/propfile3.properties deleted file mode 100644 index 10fdcf1f..00000000 --- a/hikaricp-java6/src/test/resources/propfile3.properties +++ /dev/null @@ -1,6 +0,0 @@ -connectionTestQuery=SELECT 1 -autoCommit=false -dataSourceClassName=com.zaxxer.hikari.mocks.StubDataSource -dataSource.user=test -dataSource.password=test -dataSource.url=jdbc:stub:foo diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml deleted file mode 100644 index 6cf6570b..00000000 --- a/hikaricp/pom.xml +++ /dev/null @@ -1,353 +0,0 @@ - - - 4.0.0 - - - - HikariCP - bundle - - HikariCP - Ultimate JDBC Connection Pool - https://github.com/brettwooldridge/HikariCP - - - Zaxxer.com - https://github.com/brettwooldridge - - - - 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 - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - Brett Wooldridge - brett.wooldridge@gmail.com - - - - - UTF-8 - 4.6.0 - 2.5.3 - - - - com.zaxxer - HikariCP-parent - 2.3.6-SNAPSHOT - - - - - src/main/java - src/test/java - - - - org.apache.maven.plugins - maven-surefire-plugin - - - ${surefireArgLine} - - ${skip.unit.tests} - - io.dropwizard.metrics:metrics-core - io.dropwizard.metrics:metrics-healthchecks - - - - - - org.jacoco - jacoco-maven-plugin - 0.7.2.201409121644 - - - - pre-unit-test - - prepare-agent - - - - ${project.build.directory}/coverage-reports/jacoco.exec - - surefireArgLine - - **/com/zaxxer/hikari/proxy/ProxyFactory - **/com/zaxxer/hikari/proxy/ResultSetProxy - **/com/zaxxer/hikari/proxy/StatementProxy - **/com/zaxxer/hikari/proxy/CallableStatementProxy - **/com/zaxxer/hikari/proxy/PreparedStatementProxy - **/com/zaxxer/hikari/metrics/** - - - - - - post-unit-test - test - - report - - - - ${project.build.directory}/coverage-reports/jacoco.exec - - ${project.reporting.outputDirectory}/jacoco - - **/com/zaxxer/hikari/proxy/ProxyFactory.class - **/com/zaxxer/hikari/proxy/ResultSetProxy.class - **/com/zaxxer/hikari/proxy/StatementProxy.class - **/com/zaxxer/hikari/proxy/CallableStatementProxy.class - **/com/zaxxer/hikari/proxy/PreparedStatementProxy.class - **/com/zaxxer/hikari/metrics/** - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 1.9.1 - - - src - generate-sources - - add-source - - - - ../hikaricp-common/src/main/java - - - - - test - generate-test-sources - - add-test-source - - - - ../hikaricp-common/src/test/java - - - - - test-resources - generate-test-resources - - add-test-resource - - - - - ../hikaricp-common/src/test/resources - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - true - - 1.8 - 1.8 - - - - - org.apache.felix - maven-bundle-plugin - ${felix.bundle.plugin.version} - true - - - HikariCP - - com.zaxxer.hikari, - com.zaxxer.hikari.hibernate - - com.zaxxer.hikari.* - <_exportcontents> - com.zaxxer.hikari.pool, - com.zaxxer.hikari.util, - com.zaxxer.hikari.proxy - - - javassist.*, - javax.management, - javax.naming, - javax.naming.spi, - javax.sql, - javax.sql.rowset, - javax.sql.rowset.serial, - javax.sql.rowset.spi, - com.codahale.metrics;resolution:=optional, - com.codahale.metrics.health;resolution:=optional, - org.slf4j;version="[1.6,2)", - org.hibernate;resolution:=optional, - org.hibernate.cfg;resolution:=optional, - org.hibernate.engine.jdbc.connections.spi;resolution:=optional, - org.hibernate.service;resolution:=optional, - org.hibernate.service.spi;resolution:=optional - - ${project.groupId}.${project.artifactId} - * - - - - - - - manifest - - - - - - - - - - org.apache.maven.plugins - maven-release-plugin - 2.5 - - HikariCP-@{project.version} - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - org.apache.felix - - maven-bundle-plugin - - [2.4.0,) - - manifest - - - - - - - - - - - - - - - - - coverage - - - - org.eluder.coveralls - coveralls-maven-plugin - 3.0.1 - - - coveralls - verify - - jacoco - - false - - ../hikaricp-common/src/main/java - - - - - - - - - - release-sign-artifacts - - - performRelease - true - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.4 - - - sign-artifacts - verify - - sign - - - - - - - - - - felix - - true - - pax.exam.framework - felix - - - - felix - none - - - - org.apache.felix - org.apache.felix.framework - ${felix.version} - test - - - - - diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/HikariConfig.java b/hikaricp/src/main/java/com/zaxxer/hikari/HikariConfig.java deleted file mode 100644 index 095a649b..00000000 --- a/hikaricp/src/main/java/com/zaxxer/hikari/HikariConfig.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2013, 2014 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.zaxxer.hikari; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -import com.zaxxer.hikari.proxy.JavassistProxyFactory; -import com.zaxxer.hikari.util.PropertyBeanSetter; - -public class HikariConfig extends AbstractHikariConfig -{ - static { - JavassistProxyFactory.initialize(); - } - - /** - * Default constructor - */ - public HikariConfig() - { - super(); - } - - /** - * Construct a HikariConfig from the specified properties object. - * - * @param properties the name of the property file - */ - public HikariConfig(Properties properties) - { - super(properties); - } - - /** - * Construct a HikariConfig from the specified property file name. propertyFileName - * will first be treated as a path in the file-system, and if that fails the - * ClassLoader.getResourceAsStream(propertyFileName) will be tried. - * - * @param propertyFileName the name of the property file - */ - public HikariConfig(String propertyFileName) - { - super(propertyFileName); - } - - protected void loadProperties(String propertyFileName) - { - final File propFile = new File(propertyFileName); - try (final InputStream is = propFile.isFile() ? new FileInputStream(propFile) : this.getClass().getResourceAsStream(propertyFileName)) { - if (is != null) { - Properties props = new Properties(); - props.load(is); - PropertyBeanSetter.setTargetFromProperties(this, props); - } - else { - throw new IllegalArgumentException("Property file " + propertyFileName + " was not found."); - } - } - catch (IOException io) { - throw new RuntimeException("Error loading properties file", io); - } - } -} diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java deleted file mode 100644 index 7a81b5ec..00000000 --- a/hikaricp/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (C) 2013,2014 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.zaxxer.hikari.pool; - -import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_IN_USE; -import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_NOT_IN_USE; -import static com.zaxxer.hikari.util.UtilityElf.quietlySleep; - -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.TimeUnit; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.util.ConcurrentBag; -import com.zaxxer.hikari.util.IBagStateListener; -import com.zaxxer.hikari.util.Java8ConcurrentBag; - -/** - * This is the primary connection pool class that provides the basic - * pooling behavior for HikariCP. - * - * @author Brett Wooldridge - */ -public final class HikariPool extends BaseHikariPool -{ - /** - * Construct a HikariPool with the specified configuration. - * - * @param configuration a HikariConfig instance - */ - public HikariPool(HikariConfig configuration) - { - this(configuration, configuration.getUsername(), configuration.getPassword()); - } - - /** - * Construct a HikariPool with the specified configuration. - * - * @param configuration a HikariConfig instance - * @param username authentication username - * @param password authentication password - */ - public HikariPool(HikariConfig configuration, String username, String password) - { - super(configuration, username, password); - } - - // *********************************************************************** - // IBagStateListener callback - // *********************************************************************** - - /** {@inheritDoc} */ - @Override - public void addBagItem() - { - addConnectionExecutor.execute( () -> { - long sleepBackoff = 200L; - final int maxPoolSize = configuration.getMaximumPoolSize(); - while (poolState == POOL_RUNNING && totalConnections.get() < maxPoolSize && !addConnection()) { - // If we got into the loop, addConnection() failed, so we sleep and retry - quietlySleep(sleepBackoff); - sleepBackoff = Math.min(connectionTimeout / 2, (long) ((double) sleepBackoff * 1.5)); - } - }); - } - - // *********************************************************************** - // HikariPoolMBean methods - // *********************************************************************** - - /** {@inheritDoc} */ - @Override - 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)); - } - - // *********************************************************************** - // Protected methods - // *********************************************************************** - - /** - * Permanently close the real (underlying) connection (eat any exception). - * - * @param connectionProxy the connection to actually close - */ - @Override - protected void closeConnection(final PoolBagEntry bagEntry) - { - bagEntry.cancelMaxLifeTermination(); - if (connectionBag.remove(bagEntry)) { - final int tc = totalConnections.decrementAndGet(); - if (tc < 0) { - LOGGER.warn("Internal accounting inconsistency, totalConnections={}", tc, new Exception()); - } - closeConnectionExecutor.execute(() -> { poolUtils.quietlyCloseConnection(bagEntry.connection); }); - } - } - - /** - * Check whether the connection is alive or not. - * - * @param connection the connection to test - * @param timeoutMs the timeout before we consider the test a failure - * @return true if the connection is alive, false if it is not alive or we timed out - */ - @Override - protected boolean isConnectionAlive(final Connection connection) - { - try { - int timeoutSec = (int) TimeUnit.MILLISECONDS.toSeconds(validationTimeout); - - if (isUseJdbc4Validation) { - return connection.isValid(timeoutSec); - } - - final int originalTimeout = poolUtils.getAndSetNetworkTimeout(connection, validationTimeout); - - try (Statement statement = connection.createStatement()) { - poolUtils.setQueryTimeout(statement, timeoutSec); - statement.executeQuery(configuration.getConnectionTestQuery()); - } - - if (isIsolateInternalQueries && !isAutoCommit) { - connection.rollback(); - } - - poolUtils.setNetworkTimeout(connection, originalTimeout); - - return true; - } - catch (SQLException e) { - LOGGER.warn("Exception during keep alive check, that means the connection ({}) must be dead.", connection, e); - return false; - } - } - - /** - * Attempt to abort() active connections on Java7+, or close() them on Java6. - * - * @throws InterruptedException - */ - @Override - protected void abortActiveConnections(final ExecutorService assassinExecutor) throws InterruptedException - { - connectionBag.values(STATE_IN_USE).stream().forEach(bagEntry -> { - try { - bagEntry.aborted = bagEntry.evicted = true; - bagEntry.connection.abort(assassinExecutor); - } - catch (SQLException | NoSuchMethodError | AbstractMethodError e) { - poolUtils.quietlyCloseConnection(bagEntry.connection); - } - finally { - if (connectionBag.remove(bagEntry)) { - totalConnections.decrementAndGet(); - } - } - }); - } - - /** {@inheritDoc} */ - @Override - protected Runnable getHouseKeeper() - { - return new HouseKeeper(); - } - - /** {@inheritDoc} */ - @Override - protected ConcurrentBag createConcurrentBag(IBagStateListener listener) - { - return new Java8ConcurrentBag(listener); - } - - // *********************************************************************** - // Non-anonymous Inner-classes - // *********************************************************************** - - /** - * The house keeping task to retire idle connections. - */ - private class HouseKeeper implements Runnable - { - @Override - public void run() - { - logPoolState("Before cleanup "); - - connectionTimeout = configuration.getConnectionTimeout(); // refresh member in case it changed - validationTimeout = configuration.getValidationTimeout(); // refresh member in case it changed - - final long now = System.currentTimeMillis(); - 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); - } - else { - connectionBag.unreserve(bagEntry); - } - }); - - logPoolState("After cleanup "); - - fillPool(); // Try to maintain minimum connections - } - } -} diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/util/Java8ConcurrentBag.java b/hikaricp/src/main/java/com/zaxxer/hikari/util/Java8ConcurrentBag.java deleted file mode 100644 index 19456c0c..00000000 --- a/hikaricp/src/main/java/com/zaxxer/hikari/util/Java8ConcurrentBag.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2013, 2014 Brett Wooldridge - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.zaxxer.hikari.util; - -import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_IN_USE; -import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_NOT_IN_USE; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; -import java.util.stream.Collectors; - -import com.zaxxer.hikari.pool.PoolBagEntry; - -/** - * This is a specialized concurrent bag that achieves superior performance - * to LinkedBlockingQueue and LinkedTransferQueue for the purposes of a - * connection pool. It uses ThreadLocal storage when possible to avoid - * locks, but resorts to scanning a common collection if there are no - * available items in the ThreadLocal list. Not-in-use items in the - * ThreadLocal lists can be "stolen" when the borrowing thread has none - * of its own. It is a "lock-less" implementation using a specialized - * AbstractQueuedLongSynchronizer to manage cross-thread signaling. - * - * Note that items that are "borrowed" from the bag are not actually - * removed from any collection, so garbage collection will not occur - * even if the reference is abandoned. Thus care must be taken to - * "requite" borrowed objects otherwise a memory leak will result. Only - * the "remove" method can completely remove an object from the bag. - * - * @author Brett Wooldridge - * - * @param the templated type to store in the bag - */ -public final class Java8ConcurrentBag extends ConcurrentBag -{ - /** - * Construct a ConcurrentBag with the specified listener. - * - * @param listener the IBagStateListener to attach to this bag - */ - public Java8ConcurrentBag(IBagStateListener listener) - { - super(listener); - } - - @Override - protected AbstractQueuedLongSynchronizer createQueuedSynchronizer() - { - return new Synchronizer(); - } - - /** - * This method provides a "snaphot" in time of the BagEntry - * items in the bag in the specified state. It does not "lock" - * or reserve items in any way. Call reserve(BagEntry) - * on items in list before performing any action on them. - * - * @param state one of STATE_NOT_IN_USE or STATE_IN_USE - * @return a possibly empty list of objects having the state specified - */ - public List values(final int state) - { - if (state == STATE_IN_USE || state == STATE_NOT_IN_USE) { - return sharedList.stream() - .filter(reference -> reference.state.get() == state) - .collect(Collectors.toList()); - } - - return new ArrayList(0); - } - - /** - * Get a count of the number of items in the specified state at the time of this call. - * - * @param state the state of the items to count - * @return a count of how many items in the bag are in the specified state - */ - public int getCount(final int state) - { - return (int) sharedList.stream().filter(reference -> reference.state.get() == state).count(); - } - - /** - * Our private synchronizer that handles notify/wait type semantics. - */ - private static final class Synchronizer extends AbstractQueuedLongSynchronizer - { - private static final long serialVersionUID = 104753538004341218L; - - @Override - protected long tryAcquireShared(long seq) - { - return getState() > seq && !hasQueuedPredecessors() ? 1L : -1L; - } - - /** {@inheritDoc} */ - @Override - protected boolean tryReleaseShared(long updateSeq) - { - setState(updateSeq); - - return true; - } - } -} diff --git a/pom.xml b/pom.xml index e8faae8f..5ddf0daf 100644 --- a/pom.xml +++ b/pom.xml @@ -1,13 +1,12 @@ - - + 4.0.0 com.zaxxer - HikariCP-parent - 2.3.6-SNAPSHOT - pom + HikariCP + 2.4.0-SNAPSHOT + jar - HikariCP-parent + HikariCP Ultimate JDBC Connection Pool https://github.com/brettwooldridge/HikariCP @@ -20,7 +19,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 + HEAD @@ -49,6 +48,8 @@ 3.4.0 2.3.0 1.7.10 + 2.4.0 + 4.2.1 @@ -57,11 +58,6 @@ 7 - - hikaricp - hikaricp-java6 - - org.slf4j @@ -114,7 +110,7 @@ test - + javax.inject javax.inject @@ -160,8 +156,71 @@ + + + org.apache.felix + maven-bundle-plugin + ${felix.bundle.plugin.version} + true + + + HikariCP + + com.zaxxer.hikari, + com.zaxxer.hikari.hibernate + + com.zaxxer.hikari.* + <_exportcontents> + com.zaxxer.hikari.pool, + com.zaxxer.hikari.util, + com.zaxxer.hikari.proxy + + + javassist.*, + javax.management, + javax.naming, + javax.naming.spi, + javax.sql, + javax.sql.rowset, + javax.sql.rowset.serial, + javax.sql.rowset.spi, + com.codahale.metrics;resolution:=optional, + com.codahale.metrics.health;resolution:=optional, + org.slf4j;version="[1.6,2)", + org.hibernate;resolution:=optional, + org.hibernate.cfg;resolution:=optional, + org.hibernate.engine.jdbc.connections.spi;resolution:=optional, + org.hibernate.service;resolution:=optional, + org.hibernate.service.spi;resolution:=optional + + ${project.groupId}.${project.artifactId} + * + + + + + + + manifest + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + true + + 1.7 + 1.7 + + + org.apache.maven.plugins maven-release-plugin @@ -177,9 +236,9 @@ maven-surefire-plugin 2.15 - + ${surefireArgLine} - + ${skip.unit.tests} @@ -189,7 +248,8 @@ maven-source-plugin 2.2.1 - + true @@ -208,10 +268,9 @@ 2.9.1 public - + true 1024m - ../hikaricp-common/src/main/java @@ -256,5 +315,28 @@ + + + felix + + true + + pax.exam.framework + felix + + + + felix + none + + + + org.apache.felix + org.apache.felix.framework + ${felix.version} + test + + + diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java b/src/main/java/com/zaxxer/hikari/HikariConfig.java similarity index 91% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java rename to src/main/java/com/zaxxer/hikari/HikariConfig.java index 5471c835..139ac821 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java +++ b/src/main/java/com/zaxxer/hikari/HikariConfig.java @@ -16,10 +16,12 @@ package com.zaxxer.hikari; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.sql.Connection; -import java.sql.SQLException; import java.util.Properties; import java.util.Set; import java.util.TreeSet; @@ -35,10 +37,11 @@ import org.slf4j.LoggerFactory; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.health.HealthCheckRegistry; +import com.zaxxer.hikari.proxy.JavassistProxyFactory; import com.zaxxer.hikari.util.PropertyBeanSetter; import com.zaxxer.hikari.util.UtilityElf; -public abstract class AbstractHikariConfig implements HikariConfigMBean +public class HikariConfig implements HikariConfigMBean { private static final Logger LOGGER = LoggerFactory.getLogger(HikariConfig.class); @@ -82,16 +85,20 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean private boolean isAllowPoolSuspension; private DataSource dataSource; private Properties dataSourceProperties; - private IConnectionCustomizer customizer; private ThreadFactory threadFactory; private Object metricRegistry; private Object healthCheckRegistry; private Properties healthCheckProperties; + static + { + JavassistProxyFactory.initialize(); + } + /** * Default constructor */ - public AbstractHikariConfig() + public HikariConfig() { dataSourceProperties = new Properties(); healthCheckProperties = new Properties(); @@ -104,12 +111,6 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean minIdle = -1; maxPoolSize = 10; maxLifetime = MAX_LIFETIME; - customizer = new IConnectionCustomizer() { - @Override - public void customize(Connection connection) throws SQLException - { - } - }; String systemProp = System.getProperty("hikaricp.configurationFile"); if ( systemProp != null) { @@ -122,7 +123,7 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean * * @param properties the name of the property file */ - public AbstractHikariConfig(Properties properties) + public HikariConfig(Properties properties) { this(); PropertyBeanSetter.setTargetFromProperties(this, properties); @@ -135,7 +136,7 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean * * @param propertyFileName the name of the property file */ - public AbstractHikariConfig(String propertyFileName) + public HikariConfig(String propertyFileName) { this(); @@ -162,54 +163,6 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean this.catalog = catalog; } - /** - * Get the name of the connection customizer class to instantiate and execute - * on all new connections. - * - * @return the name of the customizer class, or null - */ - @Deprecated - public String getConnectionCustomizerClassName() - { - return connectionCustomizerClassName; - } - - /** - * Set the name of the connection customizer class to instantiate and execute - * on all new connections. - * - * @param connectionCustomizerClassName the name of the customizer class - */ - @Deprecated - public void setConnectionCustomizerClassName(String connectionCustomizerClassName) - { - this.connectionCustomizerClassName = connectionCustomizerClassName; - LOGGER.warn("The connectionCustomizerClassName property has been deprecated and may be removed in a future release"); - } - - /** - * Get the customizer instance specified by the user. - * - * @return an instance of IConnectionCustomizer - */ - @Deprecated - public IConnectionCustomizer getConnectionCustomizer() - { - return customizer; - } - - /** - * Set the connection customizer to be used by the pool. - * - * @param customizer an instance of IConnectionCustomizer - */ - @Deprecated - public void setConnectionCustomizer(IConnectionCustomizer customizer) - { - this.customizer = customizer; - LOGGER.warn("The connectionCustomizer property has been deprecated and may be removed in a future release"); - } - /** * Get the SQL query to be executed to test the validity of connections. * @@ -853,11 +806,27 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean } } - abstract protected void loadProperties(String propertyFileName); + protected void loadProperties(String propertyFileName) + { + final File propFile = new File(propertyFileName); + try (final InputStream is = propFile.isFile() ? new FileInputStream(propFile) : this.getClass().getResourceAsStream(propertyFileName)) { + if (is != null) { + Properties props = new Properties(); + props.load(is); + PropertyBeanSetter.setTargetFromProperties(this, props); + } + else { + throw new IllegalArgumentException("Property file " + propertyFileName + " was not found."); + } + } + catch (IOException io) { + throw new RuntimeException("Error loading properties file", io); + } + } - public void copyState(AbstractHikariConfig other) + public void copyState(HikariConfig other) { - for (Field field : AbstractHikariConfig.class.getDeclaredFields()) { + for (Field field : HikariConfig.class.getDeclaredFields()) { if (!Modifier.isFinal(field.getModifiers())) { field.setAccessible(true); try { diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariConfigMBean.java b/src/main/java/com/zaxxer/hikari/HikariConfigMBean.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/HikariConfigMBean.java rename to src/main/java/com/zaxxer/hikari/HikariConfigMBean.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariDataSource.java b/src/main/java/com/zaxxer/hikari/HikariDataSource.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/HikariDataSource.java rename to src/main/java/com/zaxxer/hikari/HikariDataSource.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/HikariJNDIFactory.java b/src/main/java/com/zaxxer/hikari/HikariJNDIFactory.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/HikariJNDIFactory.java rename to src/main/java/com/zaxxer/hikari/HikariJNDIFactory.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/hibernate/HikariConfigurationUtil.java b/src/main/java/com/zaxxer/hikari/hibernate/HikariConfigurationUtil.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/hibernate/HikariConfigurationUtil.java rename to src/main/java/com/zaxxer/hikari/hibernate/HikariConfigurationUtil.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java b/src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java rename to src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/CodaHaleMetricsTracker.java b/src/main/java/com/zaxxer/hikari/metrics/CodaHaleMetricsTracker.java similarity index 97% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/CodaHaleMetricsTracker.java rename to src/main/java/com/zaxxer/hikari/metrics/CodaHaleMetricsTracker.java index 9ab9cf5f..2d890871 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/CodaHaleMetricsTracker.java +++ b/src/main/java/com/zaxxer/hikari/metrics/CodaHaleMetricsTracker.java @@ -24,7 +24,7 @@ import com.codahale.metrics.CachedGauge; import com.codahale.metrics.Histogram; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; -import com.zaxxer.hikari.pool.BaseHikariPool; +import com.zaxxer.hikari.pool.HikariPool; import com.zaxxer.hikari.pool.PoolBagEntry; public final class CodaHaleMetricsTracker extends MetricsTracker @@ -33,7 +33,7 @@ public final class CodaHaleMetricsTracker extends MetricsTracker private final Histogram connectionUsage; private final MetricRegistry registry; - public CodaHaleMetricsTracker(final BaseHikariPool pool, final MetricRegistry registry) { + public CodaHaleMetricsTracker(final HikariPool pool, final MetricRegistry registry) { super(pool); this.registry = registry; diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/CodahaleHealthChecker.java b/src/main/java/com/zaxxer/hikari/metrics/CodahaleHealthChecker.java similarity index 94% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/CodahaleHealthChecker.java rename to src/main/java/com/zaxxer/hikari/metrics/CodahaleHealthChecker.java index 3f508f4a..a355b9a3 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/CodahaleHealthChecker.java +++ b/src/main/java/com/zaxxer/hikari/metrics/CodahaleHealthChecker.java @@ -29,7 +29,7 @@ import com.codahale.metrics.Timer; import com.codahale.metrics.health.HealthCheck; import com.codahale.metrics.health.HealthCheckRegistry; import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.pool.BaseHikariPool; +import com.zaxxer.hikari.pool.HikariPool; /** * Provides Dropwizard HealthChecks. Two health checks are provided: @@ -54,7 +54,7 @@ public final class CodahaleHealthChecker * @param pool the pool to register health checks for * @param registry the HealthCheckRegistry into which checks will be registered */ - public static void registerHealthChecks(final BaseHikariPool pool, final HealthCheckRegistry registry) + public static void registerHealthChecks(final HikariPool pool, final HealthCheckRegistry registry) { final HikariConfig hikariConfig = pool.getConfiguration(); final Properties healthCheckProperties = hikariConfig.getHealthCheckProperties(); @@ -87,10 +87,10 @@ public final class CodahaleHealthChecker private static class ConnectivityHealthCheck extends HealthCheck { - private final BaseHikariPool pool; + private final HikariPool pool; private final long checkTimeoutMs; - ConnectivityHealthCheck(final BaseHikariPool pool, final long checkTimeoutMs) + ConnectivityHealthCheck(final HikariPool pool, final long checkTimeoutMs) { this.pool = pool; this.checkTimeoutMs = (checkTimeoutMs > 0 && checkTimeoutMs != Integer.MAX_VALUE ? checkTimeoutMs : TimeUnit.SECONDS.toMillis(10)); diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java b/src/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java similarity index 93% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java rename to src/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java index 79363f1a..701ad318 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java +++ b/src/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java @@ -16,7 +16,7 @@ package com.zaxxer.hikari.metrics; -import com.zaxxer.hikari.pool.BaseHikariPool; +import com.zaxxer.hikari.pool.HikariPool; import com.zaxxer.hikari.pool.PoolBagEntry; /** @@ -28,9 +28,9 @@ public class MetricsTracker { public static final MetricsContext NO_CONTEXT = new MetricsContext(); - protected final BaseHikariPool pool; + protected final HikariPool pool; - public MetricsTracker(final BaseHikariPool pool) + public MetricsTracker(final HikariPool pool) { this.pool = pool; } diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java b/src/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java rename to src/main/java/com/zaxxer/hikari/pool/GlobalPoolLock.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java b/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java similarity index 97% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java rename to src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java index a972fed9..25ec342c 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariMBeanElf.java @@ -52,7 +52,7 @@ public final class HikariMBeanElf * @param configuration a HikariConfig instance * @param pool a HikariPool instance */ - public static void registerMBeans(final HikariConfig configuration, final BaseHikariPool pool) + public static void registerMBeans(final HikariConfig configuration, final HikariPool pool) { if (!configuration.isRegisterMbeans()) { return; @@ -82,7 +82,7 @@ public final class HikariMBeanElf * @param configuration a HikariConfig instance * @param pool a HikariPool instance */ - public static void unregisterMBeans(final HikariConfig configuration, final BaseHikariPool pool) + public static void unregisterMBeans(final HikariConfig configuration, final HikariPool pool) { try { final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java similarity index 78% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java rename to src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 104bda13..0a8ff78f 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/BaseHikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -21,15 +21,15 @@ import static com.zaxxer.hikari.pool.HikariMBeanElf.unregisterMBeans; import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_IN_USE; import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_NOT_IN_USE; import static com.zaxxer.hikari.util.IConcurrentBagEntry.STATE_REMOVED; -import static com.zaxxer.hikari.util.UtilityElf.createInstance; import static com.zaxxer.hikari.util.UtilityElf.createThreadPoolExecutor; import static com.zaxxer.hikari.util.UtilityElf.elapsedTimeMs; import static com.zaxxer.hikari.util.UtilityElf.getTransactionIsolation; -import static com.zaxxer.hikari.util.UtilityElf.setRemoveOnCancelPolicy; +import static com.zaxxer.hikari.util.UtilityElf.quietlySleep; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLTimeoutException; +import java.sql.Statement; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; @@ -46,7 +46,6 @@ import org.slf4j.LoggerFactory; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.health.HealthCheckRegistry; import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.IConnectionCustomizer; import com.zaxxer.hikari.metrics.CodaHaleMetricsTracker; import com.zaxxer.hikari.metrics.CodahaleHealthChecker; import com.zaxxer.hikari.metrics.MetricsTracker; @@ -64,7 +63,7 @@ import com.zaxxer.hikari.util.IBagStateListener; * * @author Brett Wooldridge */ -public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListener +public class HikariPool implements HikariPoolMBean, IBagStateListener { protected final Logger LOGGER = LoggerFactory.getLogger(getClass()); private static final long ALIVE_BYPASS_WINDOW = Long.getLong("com.zaxxer.hikari.aliveBypassWindow", 1000L); @@ -96,7 +95,6 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen private final LeakTask leakTask; private final DataSource dataSource; private final GlobalPoolLock suspendResumeLock; - private final IConnectionCustomizer connectionCustomizer; private final AtomicReference lastConnectionFailure; private final String username; @@ -110,7 +108,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen * * @param configuration a HikariConfig instance */ - public BaseHikariPool(HikariConfig configuration) + public HikariPool(HikariConfig configuration) { this(configuration, configuration.getUsername(), configuration.getPassword()); } @@ -123,14 +121,14 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen * @param username authentication username * @param password authentication password */ - public BaseHikariPool(HikariConfig configuration, String username, String password) + public HikariPool(HikariConfig configuration, String username, String password) { this.username = username; this.password = password; this.configuration = configuration; this.poolUtils = new PoolUtilities(configuration); - this.connectionBag = createConcurrentBag(this); + this.connectionBag = new ConcurrentBag(this); this.totalConnections = new AtomicInteger(); this.connectionTimeout = configuration.getConnectionTimeout(); this.validationTimeout = configuration.getValidationTimeout(); @@ -142,7 +140,6 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen this.suspendResumeLock = configuration.isAllowPoolSuspension() ? new GlobalPoolLock(true) : GlobalPoolLock.FAUX_LOCK; this.catalog = configuration.getCatalog(); - this.connectionCustomizer = initializeCustomizer(); this.transactionIsolation = getTransactionIsolation(configuration.getTransactionIsolation()); this.isIsolateInternalQueries = configuration.isIsolateInternalQueries(); this.isUseJdbc4Validation = configuration.getConnectionTestQuery() == null; @@ -158,11 +155,11 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen long delayPeriod = Long.getLong("com.zaxxer.hikari.housekeeping.periodMs", TimeUnit.SECONDS.toMillis(30L)); ThreadFactory threadFactory = configuration.getThreadFactory() != null ? configuration.getThreadFactory() : new DefaultThreadFactory("Hikari Housekeeping Timer (pool " + configuration.getPoolName() + ")", true); this.houseKeepingExecutorService = new ScheduledThreadPoolExecutor(1, threadFactory, new ThreadPoolExecutor.DiscardPolicy()); - this.houseKeepingExecutorService.scheduleAtFixedRate(getHouseKeeper(), delayPeriod, delayPeriod, TimeUnit.MILLISECONDS); + this.houseKeepingExecutorService.scheduleAtFixedRate(new HouseKeeper(), delayPeriod, delayPeriod, TimeUnit.MILLISECONDS); this.houseKeepingExecutorService.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); + this.houseKeepingExecutorService.setRemoveOnCancelPolicy(true); this.leakTask = (configuration.getLeakDetectionThreshold() == 0) ? LeakTask.NO_LEAK : new LeakTask(configuration.getLeakDetectionThreshold(), houseKeepingExecutorService); - setRemoveOnCancelPolicy(houseKeepingExecutorService); poolUtils.setLoginTimeout(dataSource, connectionTimeout); registerMBeans(configuration, this); initializeConnections(); @@ -208,7 +205,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen else { metricsContext.setConnectionLastOpen(bagEntry, now); metricsContext.stop(); - return ProxyFactory.getProxyConnection((HikariPool) this, bagEntry, leakTask.start(bagEntry)); + return ProxyFactory.getProxyConnection(this, bagEntry, leakTask.start(bagEntry)); } } while (timeout > 0L); @@ -320,6 +317,31 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen return configuration.getPoolName(); } + // *********************************************************************** + // IBagStateListener callback + // *********************************************************************** + + /** {@inheritDoc} */ + @Override + public void addBagItem() + { + class AddConnection implements Runnable + { + public void run() + { + long sleepBackoff = 200L; + final int maxPoolSize = configuration.getMaximumPoolSize(); + while (poolState == POOL_RUNNING && totalConnections.get() < maxPoolSize && !addConnection()) { + // If we got into the loop, addConnection() failed, so we sleep and retry + quietlySleep(sleepBackoff); + sleepBackoff = Math.min(connectionTimeout / 2, (long) ((double) sleepBackoff * 1.5)); + } + } + } + + addConnectionExecutor.execute(new AddConnection()); + } + // *********************************************************************** // HikariPoolMBean methods // *********************************************************************** @@ -352,6 +374,21 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen return connectionBag.getPendingQueue(); } + /** {@inheritDoc} */ + @Override + public void softEvictConnections() + { + for (PoolBagEntry bagEntry : connectionBag.values(STATE_IN_USE)) { + bagEntry.evicted = true; + } + + for (PoolBagEntry bagEntry : connectionBag.values(STATE_NOT_IN_USE)) { + if (connectionBag.reserve(bagEntry)) { + closeConnection(bagEntry); + } + } + } + /** {@inheritDoc} */ @Override public final void suspendPool() @@ -418,7 +455,6 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen transactionIsolation = (transactionIsolation < 0 ? connection.getTransactionIsolation() : transactionIsolation); poolUtils.setupConnection(connection, isAutoCommit, isReadOnly, transactionIsolation, catalog); - connectionCustomizer.customize(connection); poolUtils.executeSql(connection, configuration.getConnectionInitSql(), isAutoCommit); poolUtils.setNetworkTimeout(connection, originalTimeout); @@ -456,47 +492,90 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen } } - // *********************************************************************** - // Abstract methods - // *********************************************************************** - /** * Permanently close the real (underlying) connection (eat any exception). * * @param connectionProxy the connection to actually close */ - protected abstract void closeConnection(final PoolBagEntry bagEntry); + protected void closeConnection(final PoolBagEntry bagEntry) + { + bagEntry.cancelMaxLifeTermination(); + if (connectionBag.remove(bagEntry)) { + final int tc = totalConnections.decrementAndGet(); + if (tc < 0) { + LOGGER.warn("Internal accounting inconsistency, totalConnections={}", tc, new Exception()); + } + closeConnectionExecutor.execute(new Runnable() { + public void run() { + poolUtils.quietlyCloseConnection(bagEntry.connection); + } + }); + } + } /** * Check whether the connection is alive or not. * * @param connection the connection to test + * @param timeoutMs the timeout before we consider the test a failure * @return true if the connection is alive, false if it is not alive or we timed out */ - protected abstract boolean isConnectionAlive(final Connection connection); + protected boolean isConnectionAlive(final Connection connection) + { + try { + int timeoutSec = (int) TimeUnit.MILLISECONDS.toSeconds(validationTimeout); + + if (isUseJdbc4Validation) { + return connection.isValid(timeoutSec); + } + + final int originalTimeout = poolUtils.getAndSetNetworkTimeout(connection, validationTimeout); + + try (Statement statement = connection.createStatement()) { + poolUtils.setQueryTimeout(statement, timeoutSec); + statement.executeQuery(configuration.getConnectionTestQuery()); + } + + if (isIsolateInternalQueries && !isAutoCommit) { + connection.rollback(); + } + + poolUtils.setNetworkTimeout(connection, originalTimeout); + + return true; + } + catch (SQLException e) { + LOGGER.warn("Exception during keep alive check, that means the connection ({}) must be dead.", connection, e); + return false; + } + } /** - * Attempt to abort() active connections on Java7+, or close() them on Java6. - * @param assassinExecutor + * Attempt to abort() active connections, or close() them. * * @throws InterruptedException */ - protected abstract void abortActiveConnections(final ExecutorService assassinExecutor) throws InterruptedException; + protected void abortActiveConnections(final ExecutorService assassinExecutor) throws InterruptedException + { + for (PoolBagEntry bagEntry : connectionBag.values(STATE_IN_USE)) { + try { + bagEntry.aborted = bagEntry.evicted = true; + bagEntry.connection.abort(assassinExecutor); + } + catch (Throwable e) { + if (e instanceof InterruptedException) { + throw (InterruptedException) e; + } + poolUtils.quietlyCloseConnection(bagEntry.connection); + } + finally { + if (connectionBag.remove(bagEntry)) { + totalConnections.decrementAndGet(); + } + } + } + } - /** - * Create the JVM version-specific ConcurrentBag instance used by the pool. - * - * @param listener the IBagStateListener instance - * @return a ConcurrentBag instance - */ - protected abstract ConcurrentBag createConcurrentBag(IBagStateListener listener); - - /** - * Create the JVM version-specific Housekeeping runnable instance used by the pool. - * @return the HouseKeeper instance - */ - protected abstract Runnable getHouseKeeper(); - // *********************************************************************** // Private methods // *********************************************************************** @@ -531,20 +610,6 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen fillPool(); } - /** - * Construct the user's connection customizer, if specified. - * - * @return an IConnectionCustomizer instance - */ - private IConnectionCustomizer initializeCustomizer() - { - if (configuration.getConnectionCustomizerClassName() != null) { - return createInstance(configuration.getConnectionCustomizerClassName(), IConnectionCustomizer.class); - } - - return configuration.getConnectionCustomizer(); - } - public final void logPoolState(String... prefix) { if (LOGGER.isDebugEnabled()) { @@ -553,4 +618,40 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen getTotalConnections(), getActiveConnections(), getIdleConnections(), getThreadsAwaitingConnection()); } } + + // *********************************************************************** + // Non-anonymous Inner-classes + // *********************************************************************** + + /** + * The house keeping task to retire idle connections. + */ + private class HouseKeeper implements Runnable + { + @Override + public void run() + { + logPoolState("Before cleanup "); + + connectionTimeout = configuration.getConnectionTimeout(); // refresh member in case it changed + + final long now = System.currentTimeMillis(); + final long idleTimeout = configuration.getIdleTimeout(); + + for (PoolBagEntry bagEntry : connectionBag.values(STATE_NOT_IN_USE)) { + if (connectionBag.reserve(bagEntry)) { + if (bagEntry.evicted || (idleTimeout > 0L && now > bagEntry.lastAccess + idleTimeout)) { + closeConnection(bagEntry); + } + else { + connectionBag.unreserve(bagEntry); + } + } + } + + logPoolState("After cleanup "); + + fillPool(); // Try to maintain minimum connections + } + } } diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java b/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java rename to src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java b/src/main/java/com/zaxxer/hikari/pool/LeakTask.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/LeakTask.java rename to src/main/java/com/zaxxer/hikari/pool/LeakTask.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java b/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java similarity index 97% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java rename to src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java index 8c846a96..1873d18d 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java @@ -40,7 +40,7 @@ public final class PoolBagEntry implements IConcurrentBagEntry private volatile ScheduledFuture endOfLife; - public PoolBagEntry(final Connection connection, final BaseHikariPool pool) { + public PoolBagEntry(final Connection connection, final HikariPool pool) { this.connection = connection; this.lastAccess = System.currentTimeMillis(); diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java b/src/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java rename to src/main/java/com/zaxxer/hikari/pool/PoolInitializationException.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java b/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java rename to src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java b/src/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java rename to src/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ClosedConnection.java b/src/main/java/com/zaxxer/hikari/proxy/ClosedConnection.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ClosedConnection.java rename to src/main/java/com/zaxxer/hikari/proxy/ClosedConnection.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java rename to src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/IHikariConnectionProxy.java b/src/main/java/com/zaxxer/hikari/proxy/IHikariConnectionProxy.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/IHikariConnectionProxy.java rename to src/main/java/com/zaxxer/hikari/proxy/IHikariConnectionProxy.java diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java b/src/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java similarity index 100% rename from hikaricp/src/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java rename to src/main/java/com/zaxxer/hikari/proxy/JavassistProxyFactory.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java b/src/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java rename to src/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java b/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java rename to src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java b/src/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java rename to src/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/StatementProxy.java b/src/main/java/com/zaxxer/hikari/proxy/StatementProxy.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/StatementProxy.java rename to src/main/java/com/zaxxer/hikari/proxy/StatementProxy.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/ClassLoaderUtils.java b/src/main/java/com/zaxxer/hikari/util/ClassLoaderUtils.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/ClassLoaderUtils.java rename to src/main/java/com/zaxxer/hikari/util/ClassLoaderUtils.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java similarity index 94% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java rename to src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java index 211aee7b..fecc90ee 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java +++ b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java @@ -71,17 +71,12 @@ public class ConcurrentBag public ConcurrentBag(IBagStateListener listener) { this.sharedList = new CopyOnWriteArrayList(); - this.synchronizer = createQueuedSynchronizer(); + this.synchronizer = new Synchronizer(); this.sequence = new AtomicLong(1); this.listener = listener; this.threadList = new ThreadLocal>>(); } - protected AbstractQueuedLongSynchronizer createQueuedSynchronizer() - { - throw new RuntimeException("createQueuedSynchronizer() method must be overridden"); - } - /** * The method will borrow a BagEntry from the bag, blocking for the * specified timeout if none are available. @@ -307,4 +302,27 @@ public class ConcurrentBag LOGGER.info(bagEntry.toString()); } } + + /** + * Our private synchronizer that handles notify/wait type semantics. + */ + private static final class Synchronizer extends AbstractQueuedLongSynchronizer + { + private static final long serialVersionUID = 104753538004341218L; + + @Override + protected long tryAcquireShared(long seq) + { + return getState() > seq && !hasQueuedPredecessors() ? 1L : -1L; + } + + /** {@inheritDoc} */ + @Override + protected boolean tryReleaseShared(long updateSeq) + { + setState(updateSeq); + + return true; + } + } } diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/DefaultThreadFactory.java b/src/main/java/com/zaxxer/hikari/util/DefaultThreadFactory.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/DefaultThreadFactory.java rename to src/main/java/com/zaxxer/hikari/util/DefaultThreadFactory.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/DriverDataSource.java b/src/main/java/com/zaxxer/hikari/util/DriverDataSource.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/DriverDataSource.java rename to src/main/java/com/zaxxer/hikari/util/DriverDataSource.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/FastList.java b/src/main/java/com/zaxxer/hikari/util/FastList.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/FastList.java rename to src/main/java/com/zaxxer/hikari/util/FastList.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/IBagStateListener.java b/src/main/java/com/zaxxer/hikari/util/IBagStateListener.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/IBagStateListener.java rename to src/main/java/com/zaxxer/hikari/util/IBagStateListener.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/IConcurrentBagEntry.java b/src/main/java/com/zaxxer/hikari/util/IConcurrentBagEntry.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/IConcurrentBagEntry.java rename to src/main/java/com/zaxxer/hikari/util/IConcurrentBagEntry.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java b/src/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java similarity index 100% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java rename to src/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/UtilityElf.java b/src/main/java/com/zaxxer/hikari/util/UtilityElf.java similarity index 86% rename from hikaricp-common/src/main/java/com/zaxxer/hikari/util/UtilityElf.java rename to src/main/java/com/zaxxer/hikari/util/UtilityElf.java index 750182ea..61d4c063 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/util/UtilityElf.java +++ b/src/main/java/com/zaxxer/hikari/util/UtilityElf.java @@ -21,11 +21,9 @@ import java.lang.reflect.Field; import java.sql.Connection; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; /** * @@ -33,19 +31,6 @@ import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; */ public final class UtilityElf { - public static final boolean IS_JAVA7; - - static { - boolean b = false; - try { - b = AbstractQueuedLongSynchronizer.class.getMethod("hasQueuedPredecessors", new Class[0]) != null; - } - catch (Exception e) { - } - - IS_JAVA7 = b; - } - /** * Get the elapsed time in millisecond between the specified start time and now. * @@ -72,18 +57,6 @@ public final class UtilityElf } } - /** - * If the scheduled executor supports it, set the removeonCancelPolicy. - * - * @param executor the executor to set - */ - public static void setRemoveOnCancelPolicy(ScheduledThreadPoolExecutor executor) - { - if (IS_JAVA7) { - executor.setRemoveOnCancelPolicy(true); - } - } - /** * Create and instance of the specified class using the constructor matching the specified * arguments. diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java b/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java similarity index 98% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java rename to src/test/java/com/zaxxer/hikari/ConnectionStateTest.java index 6afb8b52..25598af6 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java +++ b/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java @@ -12,7 +12,6 @@ import com.zaxxer.hikari.util.UtilityElf; public class ConnectionStateTest { - @SuppressWarnings("deprecation") @Test public void testAutoCommit() throws SQLException { @@ -20,7 +19,6 @@ public class ConnectionStateTest ds.setAutoCommit(true); ds.setMinimumIdle(1); ds.setMaximumPoolSize(1); - ds.setJdbc4ConnectionTest(false); ds.setConnectionTestQuery("VALUES 1"); ds.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); ds.addDataSourceProperty("user", "bar"); diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/ExceptionTest.java b/src/test/java/com/zaxxer/hikari/ExceptionTest.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/ExceptionTest.java rename to src/test/java/com/zaxxer/hikari/ExceptionTest.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/IsolationTest.java b/src/test/java/com/zaxxer/hikari/IsolationTest.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/IsolationTest.java rename to src/test/java/com/zaxxer/hikari/IsolationTest.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java b/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java rename to src/test/java/com/zaxxer/hikari/JdbcDriverTest.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java b/src/test/java/com/zaxxer/hikari/MiscTest.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/MiscTest.java rename to src/test/java/com/zaxxer/hikari/MiscTest.java diff --git a/hikaricp/src/test/java/com/zaxxer/hikari/PostgresTest.java b/src/test/java/com/zaxxer/hikari/PostgresTest.java similarity index 100% rename from hikaricp/src/test/java/com/zaxxer/hikari/PostgresTest.java rename to src/test/java/com/zaxxer/hikari/PostgresTest.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/RampUpDown.java b/src/test/java/com/zaxxer/hikari/RampUpDown.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/RampUpDown.java rename to src/test/java/com/zaxxer/hikari/RampUpDown.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/src/test/java/com/zaxxer/hikari/ShutdownTest.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/ShutdownTest.java rename to src/test/java/com/zaxxer/hikari/ShutdownTest.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/StatementTest.java b/src/test/java/com/zaxxer/hikari/StatementTest.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/StatementTest.java rename to src/test/java/com/zaxxer/hikari/StatementTest.java diff --git a/hikaricp/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java b/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java similarity index 64% rename from hikaricp/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java rename to src/test/java/com/zaxxer/hikari/TestConcurrentBag.java index 780d2049..bbc539e5 100644 --- a/hikaricp/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java +++ b/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java @@ -16,12 +16,9 @@ package com.zaxxer.hikari; -import static com.zaxxer.hikari.util.UtilityElf.IS_JAVA7; - import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; import org.junit.AfterClass; import org.junit.Assert; @@ -31,8 +28,6 @@ import org.junit.Test; import com.zaxxer.hikari.pool.HikariPool; import com.zaxxer.hikari.pool.PoolBagEntry; import com.zaxxer.hikari.util.ConcurrentBag; -import com.zaxxer.hikari.util.IConcurrentBagEntry; -import com.zaxxer.hikari.util.Java8ConcurrentBag; /** * @@ -64,7 +59,7 @@ public class TestConcurrentBag @Test public void testConcurrentBag() throws InterruptedException { - ConcurrentBag bag = new Java8ConcurrentBag(null); + ConcurrentBag bag = new ConcurrentBag(null); Assert.assertEquals(0, bag.values(8).size()); HikariPool pool = TestElf.getPool(ds); @@ -83,7 +78,7 @@ public class TestConcurrentBag ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos, true); - TestElf.setSlf4jTargetStream(Java8ConcurrentBag.class, ps); + TestElf.setSlf4jTargetStream(ConcurrentBag.class, ps); bag.requite(reserved); Assert.assertTrue(new String(baos.toByteArray()).contains("does not exist")); @@ -110,60 +105,4 @@ public class TestConcurrentBag Assert.assertNotNull(notinuse.toString()); } - - @Test - public void testConcurrentBag2() throws InterruptedException - { - ConcurrentBag bag = new FauxJava6ConcurrentBag(); - Assert.assertEquals(0, bag.values(IConcurrentBagEntry.STATE_IN_USE).size()); - Assert.assertEquals(0, bag.getCount(IConcurrentBagEntry.STATE_IN_USE)); - } - - private static class FauxJava6ConcurrentBag extends ConcurrentBag - { - /** - * @param listener - */ - public FauxJava6ConcurrentBag() { - super(null); - } - - @Override - protected AbstractQueuedLongSynchronizer createQueuedSynchronizer() - { - return new Synchronizer(); - } - } - - /** - * Our private synchronizer that handles notify/wait type semantics. - */ - private static final class Synchronizer extends AbstractQueuedLongSynchronizer - { - private static final long serialVersionUID = 104753538004341218L; - - @Override - protected long tryAcquireShared(long seq) - { - return getState() > seq && !java67hasQueuedPredecessors() ? 1L : -1L; - } - - /** {@inheritDoc} */ - @Override - protected boolean tryReleaseShared(long updateSeq) - { - setState(updateSeq); - - return true; - } - - private boolean java67hasQueuedPredecessors() - { - if (IS_JAVA7) { - return hasQueuedPredecessors(); - } - - return false; - } - } } diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestConnectionCloseBlocking.java b/src/test/java/com/zaxxer/hikari/TestConnectionCloseBlocking.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestConnectionCloseBlocking.java rename to src/test/java/com/zaxxer/hikari/TestConnectionCloseBlocking.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestConnectionTimeoutRetry.java b/src/test/java/com/zaxxer/hikari/TestConnectionTimeoutRetry.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestConnectionTimeoutRetry.java rename to src/test/java/com/zaxxer/hikari/TestConnectionTimeoutRetry.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestConnections.java b/src/test/java/com/zaxxer/hikari/TestConnections.java similarity index 99% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestConnections.java rename to src/test/java/com/zaxxer/hikari/TestConnections.java index cb4118e9..ca258efc 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestConnections.java +++ b/src/test/java/com/zaxxer/hikari/TestConnections.java @@ -41,7 +41,6 @@ import com.zaxxer.hikari.util.UtilityElf; */ public class TestConnections { - @SuppressWarnings("deprecation") @Test public void testCreate() throws SQLException { diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestElf.java b/src/test/java/com/zaxxer/hikari/TestElf.java similarity index 97% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestElf.java rename to src/test/java/com/zaxxer/hikari/TestElf.java index 139583ea..b201818a 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestElf.java +++ b/src/test/java/com/zaxxer/hikari/TestElf.java @@ -78,7 +78,7 @@ public final class TestElf public static void setConfigUnitTest(boolean unitTest) { try { - Field field = AbstractHikariConfig.class.getDeclaredField("unitTest"); + Field field = HikariConfig.class.getDeclaredField("unitTest"); field.setAccessible(true); field.setBoolean(null, unitTest); } diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestFastList.java b/src/test/java/com/zaxxer/hikari/TestFastList.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestFastList.java rename to src/test/java/com/zaxxer/hikari/TestFastList.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestHibernate.java b/src/test/java/com/zaxxer/hikari/TestHibernate.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestHibernate.java rename to src/test/java/com/zaxxer/hikari/TestHibernate.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestJNDI.java b/src/test/java/com/zaxxer/hikari/TestJNDI.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestJNDI.java rename to src/test/java/com/zaxxer/hikari/TestJNDI.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestMBean.java b/src/test/java/com/zaxxer/hikari/TestMBean.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestMBean.java rename to src/test/java/com/zaxxer/hikari/TestMBean.java diff --git a/hikaricp-java6/src/test/java/com/zaxxer/hikari/TestMetrics.java b/src/test/java/com/zaxxer/hikari/TestMetrics.java similarity index 100% rename from hikaricp-java6/src/test/java/com/zaxxer/hikari/TestMetrics.java rename to src/test/java/com/zaxxer/hikari/TestMetrics.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestPropertySetter.java b/src/test/java/com/zaxxer/hikari/TestPropertySetter.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestPropertySetter.java rename to src/test/java/com/zaxxer/hikari/TestPropertySetter.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestProxies.java b/src/test/java/com/zaxxer/hikari/TestProxies.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestProxies.java rename to src/test/java/com/zaxxer/hikari/TestProxies.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestValidation.java b/src/test/java/com/zaxxer/hikari/TestValidation.java similarity index 83% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/TestValidation.java rename to src/test/java/com/zaxxer/hikari/TestValidation.java index 0924a117..4e830d29 100644 --- a/hikaricp-common/src/test/java/com/zaxxer/hikari/TestValidation.java +++ b/src/test/java/com/zaxxer/hikari/TestValidation.java @@ -17,8 +17,6 @@ package com.zaxxer.hikari; import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import java.sql.Connection; -import java.sql.SQLException; import java.util.concurrent.TimeUnit; import org.junit.Assert; @@ -29,7 +27,6 @@ import com.zaxxer.hikari.mocks.StubDataSource; /** * @author Brett Wooldridge */ -@SuppressWarnings("deprecation") public class TestValidation { @Test @@ -41,47 +38,6 @@ public class TestValidation Assert.assertEquals(5, config.getMinimumIdle()); } - @Test - public void validateInvalidCustomizer() - { - HikariConfig config = new HikariConfig(); - config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); - config.setConnectionCustomizerClassName("invalid"); - config.validate(); - - Assert.assertNull(config.getConnectionCustomizerClassName()); - } - - @Test - public void validateValidCustomizer() - { - try { - HikariConfig config = new HikariConfig(); - config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); - config.setConnectionCustomizerClassName("com.zaxxer.hikari.TestValidation$TestCustomizer"); - config.validate(); - Assert.assertNotNull(config.getConnectionCustomizer()); - } - catch (Exception e) { - Assert.fail(); - } - } - - @Test - public void validateValidCustomizer2() - { - try { - HikariConfig config = new HikariConfig(); - config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); - config.setConnectionCustomizer(new TestCustomizer()); - config.validate(); - Assert.assertNotNull(config.getConnectionCustomizer()); - } - catch (Exception e) { - Assert.fail(); - } - } - @Test public void validateMissingProperties() { @@ -297,12 +253,4 @@ public class TestValidation // pass } } - - public static class TestCustomizer implements IConnectionCustomizer - { - @Override - public void customize(Connection connection) throws SQLException - { - } - } } diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/UnwrapTest.java b/src/test/java/com/zaxxer/hikari/UnwrapTest.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/UnwrapTest.java rename to src/test/java/com/zaxxer/hikari/UnwrapTest.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/MockDataSource.java b/src/test/java/com/zaxxer/hikari/mocks/MockDataSource.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/MockDataSource.java rename to src/test/java/com/zaxxer/hikari/mocks/MockDataSource.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubBaseConnection.java b/src/test/java/com/zaxxer/hikari/mocks/StubBaseConnection.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubBaseConnection.java rename to src/test/java/com/zaxxer/hikari/mocks/StubBaseConnection.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubConnection.java b/src/test/java/com/zaxxer/hikari/mocks/StubConnection.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubConnection.java rename to src/test/java/com/zaxxer/hikari/mocks/StubConnection.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubDataSource.java b/src/test/java/com/zaxxer/hikari/mocks/StubDataSource.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubDataSource.java rename to src/test/java/com/zaxxer/hikari/mocks/StubDataSource.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubDriver.java b/src/test/java/com/zaxxer/hikari/mocks/StubDriver.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubDriver.java rename to src/test/java/com/zaxxer/hikari/mocks/StubDriver.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubPreparedStatement.java b/src/test/java/com/zaxxer/hikari/mocks/StubPreparedStatement.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubPreparedStatement.java rename to src/test/java/com/zaxxer/hikari/mocks/StubPreparedStatement.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubResultSet.java b/src/test/java/com/zaxxer/hikari/mocks/StubResultSet.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubResultSet.java rename to src/test/java/com/zaxxer/hikari/mocks/StubResultSet.java diff --git a/hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubStatement.java b/src/test/java/com/zaxxer/hikari/mocks/StubStatement.java similarity index 100% rename from hikaricp-common/src/test/java/com/zaxxer/hikari/mocks/StubStatement.java rename to src/test/java/com/zaxxer/hikari/mocks/StubStatement.java diff --git a/hikaricp/src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java b/src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java similarity index 100% rename from hikaricp/src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java rename to src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java diff --git a/hikaricp-common/src/test/resources/hibernate.properties b/src/test/resources/hibernate.properties similarity index 100% rename from hikaricp-common/src/test/resources/hibernate.properties rename to src/test/resources/hibernate.properties diff --git a/hikaricp-common/src/test/resources/propfile1.properties b/src/test/resources/propfile1.properties similarity index 100% rename from hikaricp-common/src/test/resources/propfile1.properties rename to src/test/resources/propfile1.properties diff --git a/hikaricp-common/src/test/resources/propfile2.properties b/src/test/resources/propfile2.properties similarity index 100% rename from hikaricp-common/src/test/resources/propfile2.properties rename to src/test/resources/propfile2.properties diff --git a/hikaricp-common/src/test/resources/propfile3.properties b/src/test/resources/propfile3.properties similarity index 100% rename from hikaricp-common/src/test/resources/propfile3.properties rename to src/test/resources/propfile3.properties From 1ed525d3516235b93c30cd3909bcf3e9bfddbe58 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 21:50:19 +0900 Subject: [PATCH 30/40] Fix #258 Improve logging of closed connection reason --- .../com/zaxxer/hikari/pool/HikariPool.java | 33 ++++++++++--------- .../com/zaxxer/hikari/pool/PoolBagEntry.java | 2 +- .../com/zaxxer/hikari/pool/PoolUtilities.java | 5 +-- .../java/com/zaxxer/hikari/ShutdownTest.java | 2 +- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 0a8ff78f..a4f93737 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -199,7 +199,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener 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 { @@ -233,7 +233,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener 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 { bagEntry.lastAccess = System.currentTimeMillis(); @@ -288,7 +288,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener */ public final void evictConnection(IHikariConnectionProxy proxyConnection) { - closeConnection(proxyConnection.getPoolBagEntry()); + closeConnection(proxyConnection.getPoolBagEntry(), "connection evicted by user"); } /** @@ -384,7 +384,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener for (PoolBagEntry bagEntry : connectionBag.values(STATE_NOT_IN_USE)) { if (connectionBag.reserve(bagEntry)) { - closeConnection(bagEntry); + closeConnection(bagEntry, "connection evicted by user"); } } } @@ -464,8 +464,8 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener } catch (Exception e) { lastConnectionFailure.set(e); - poolUtils.quietlyCloseConnection(connection); LOGGER.debug("Connection attempt to database {} failed: {}", configuration.getPoolName(), e.getMessage(), e); + poolUtils.quietlyCloseConnection(connection, "exception during connection creation"); } } @@ -497,7 +497,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener * * @param connectionProxy the connection to actually close */ - protected void closeConnection(final PoolBagEntry bagEntry) + protected void closeConnection(final PoolBagEntry bagEntry, final String closureReason) { bagEntry.cancelMaxLifeTermination(); if (connectionBag.remove(bagEntry)) { @@ -507,7 +507,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener } closeConnectionExecutor.execute(new Runnable() { public void run() { - poolUtils.quietlyCloseConnection(bagEntry.connection); + poolUtils.quietlyCloseConnection(bagEntry.connection, closureReason); } }); } @@ -550,12 +550,16 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener } } + // *********************************************************************** + // Private methods + // *********************************************************************** + /** * Attempt to abort() active connections, or close() them. * * @throws InterruptedException */ - protected void abortActiveConnections(final ExecutorService assassinExecutor) throws InterruptedException + private void abortActiveConnections(final ExecutorService assassinExecutor) throws InterruptedException { for (PoolBagEntry bagEntry : connectionBag.values(STATE_IN_USE)) { try { @@ -566,7 +570,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener if (e instanceof InterruptedException) { throw (InterruptedException) e; } - poolUtils.quietlyCloseConnection(bagEntry.connection); + poolUtils.quietlyCloseConnection(bagEntry.connection, "connection aborted during shutdown"); } finally { if (connectionBag.remove(bagEntry)) { @@ -576,10 +580,6 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener } } - // *********************************************************************** - // Private methods - // *********************************************************************** - /** * Fill the pool up to the minimum size. */ @@ -640,8 +640,11 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener 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/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java b/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java index 1873d18d..813341d6 100644 --- a/src/main/java/com/zaxxer/hikari/pool/PoolBagEntry.java +++ b/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/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java b/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java index 5194d211..8a2c7db9 100644 --- a/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java @@ -45,11 +45,12 @@ public final class PoolUtilities * Close connection and eat any exception. * * @param connection the connection to close + * @param closureReason the reason the connection was closed (if known) */ - public void quietlyCloseConnection(final Connection connection) + public void quietlyCloseConnection(final Connection connection, final String closureReason) { try { - LOGGER.debug("Closing connection {}", connection); + LOGGER.debug("Closing connection {} {}", connection, (closureReason != null ? "(" + closureReason + ")" : "")); if (connection != null && !connection.isClosed()) { setNetworkTimeout(connection, TimeUnit.SECONDS.toMillis(30)); connection.close(); diff --git a/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/src/test/java/com/zaxxer/hikari/ShutdownTest.java index f1496bfb..8b12e55e 100644 --- a/src/test/java/com/zaxxer/hikari/ShutdownTest.java +++ b/src/test/java/com/zaxxer/hikari/ShutdownTest.java @@ -282,7 +282,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(); } }; From 50e1ec24ffbea8f0abb460b7f4c83267d5cc7253 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 22:03:39 +0900 Subject: [PATCH 31/40] If the pool is maxed out, return 'true' from addConnection() so we stop trying to add the connection. --- .../com/zaxxer/hikari/pool/HikariPool.java | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index a4f93737..32af2574 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -108,8 +108,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener * * @param configuration a HikariConfig instance */ - public HikariPool(HikariConfig configuration) - { + public HikariPool(HikariConfig configuration) { this(configuration, configuration.getUsername(), configuration.getPassword()); } @@ -117,51 +116,50 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener * Construct a HikariPool with the specified configuration. We cache lots of configuration * items in class-local final members for speed. * - * @param configuration a HikariConfig instance + * @param config a HikariConfig instance * @param username authentication username * @param password authentication password */ - public HikariPool(HikariConfig configuration, String username, String password) - { + public HikariPool(HikariConfig config, String username, String password) { this.username = username; this.password = password; - this.configuration = configuration; + this.configuration = config; - this.poolUtils = new PoolUtilities(configuration); + this.poolUtils = new PoolUtilities(config); this.connectionBag = new ConcurrentBag(this); this.totalConnections = new AtomicInteger(); - this.connectionTimeout = configuration.getConnectionTimeout(); - this.validationTimeout = configuration.getValidationTimeout(); + this.connectionTimeout = config.getConnectionTimeout(); + this.validationTimeout = config.getValidationTimeout(); this.lastConnectionFailure = new AtomicReference(); - this.isReadOnly = configuration.isReadOnly(); - this.isAutoCommit = configuration.isAutoCommit(); + this.isReadOnly = config.isReadOnly(); + this.isAutoCommit = config.isAutoCommit(); - this.suspendResumeLock = configuration.isAllowPoolSuspension() ? new GlobalPoolLock(true) : GlobalPoolLock.FAUX_LOCK; + this.suspendResumeLock = config.isAllowPoolSuspension() ? new GlobalPoolLock(true) : GlobalPoolLock.FAUX_LOCK; - this.catalog = configuration.getCatalog(); - this.transactionIsolation = getTransactionIsolation(configuration.getTransactionIsolation()); - this.isIsolateInternalQueries = configuration.isIsolateInternalQueries(); - this.isUseJdbc4Validation = configuration.getConnectionTestQuery() == null; + this.catalog = config.getCatalog(); + this.transactionIsolation = getTransactionIsolation(config.getTransactionIsolation()); + this.isIsolateInternalQueries = config.isIsolateInternalQueries(); + this.isUseJdbc4Validation = config.getConnectionTestQuery() == null; - setMetricRegistry(configuration.getMetricRegistry()); - setHealthCheckRegistry(configuration.getHealthCheckRegistry()); + setMetricRegistry(config.getMetricRegistry()); + setHealthCheckRegistry(config.getHealthCheckRegistry()); - this.dataSource = poolUtils.initializeDataSource(configuration.getDataSourceClassName(), configuration.getDataSource(), configuration.getDataSourceProperties(), configuration.getDriverClassName(), configuration.getJdbcUrl(), username, password); + this.dataSource = poolUtils.initializeDataSource(config.getDataSourceClassName(), config.getDataSource(), config.getDataSourceProperties(), config.getDriverClassName(), config.getJdbcUrl(), username, password); - this.addConnectionExecutor = createThreadPoolExecutor(configuration.getMaximumPoolSize(), "HikariCP connection filler (pool " + configuration.getPoolName() + ")", configuration.getThreadFactory(), new ThreadPoolExecutor.DiscardPolicy()); - this.closeConnectionExecutor = createThreadPoolExecutor(4, "HikariCP connection closer (pool " + configuration.getPoolName() + ")", configuration.getThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); + this.addConnectionExecutor = createThreadPoolExecutor(config.getMaximumPoolSize(), "HikariCP connection filler (pool " + config.getPoolName() + ")", config.getThreadFactory(), new ThreadPoolExecutor.DiscardPolicy()); + this.closeConnectionExecutor = createThreadPoolExecutor(4, "HikariCP connection closer (pool " + config.getPoolName() + ")", config.getThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); long delayPeriod = Long.getLong("com.zaxxer.hikari.housekeeping.periodMs", TimeUnit.SECONDS.toMillis(30L)); - ThreadFactory threadFactory = configuration.getThreadFactory() != null ? configuration.getThreadFactory() : new DefaultThreadFactory("Hikari Housekeeping Timer (pool " + configuration.getPoolName() + ")", true); + ThreadFactory threadFactory = config.getThreadFactory() != null ? config.getThreadFactory() : new DefaultThreadFactory("Hikari Housekeeping Timer (pool " + config.getPoolName() + ")", true); this.houseKeepingExecutorService = new ScheduledThreadPoolExecutor(1, threadFactory, new ThreadPoolExecutor.DiscardPolicy()); this.houseKeepingExecutorService.scheduleAtFixedRate(new HouseKeeper(), delayPeriod, delayPeriod, TimeUnit.MILLISECONDS); this.houseKeepingExecutorService.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); this.houseKeepingExecutorService.setRemoveOnCancelPolicy(true); - this.leakTask = (configuration.getLeakDetectionThreshold() == 0) ? LeakTask.NO_LEAK : new LeakTask(configuration.getLeakDetectionThreshold(), houseKeepingExecutorService); + this.leakTask = (config.getLeakDetectionThreshold() == 0) ? LeakTask.NO_LEAK : new LeakTask(config.getLeakDetectionThreshold(), houseKeepingExecutorService); poolUtils.setLoginTimeout(dataSource, connectionTimeout); - registerMBeans(configuration, this); + registerMBeans(config, this); initializeConnections(); } @@ -221,7 +219,6 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener throw new SQLTimeoutException(String.format("Timeout after %dms of waiting for a connection.", elapsedTimeMs(start)), lastConnectionFailure.getAndSet(null)); } - /** * Release a connection back to the pool, or permanently close it if it is broken. * @@ -463,14 +460,18 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener return true; } catch (Exception e) { + totalConnections.decrementAndGet(); // We failed so undo speculative increment of totalConnections lastConnectionFailure.set(e); LOGGER.debug("Connection attempt to database {} failed: {}", configuration.getPoolName(), e.getMessage(), e); poolUtils.quietlyCloseConnection(connection, "exception during connection creation"); + return false; } } - - totalConnections.decrementAndGet(); // We failed or pool is max, so undo speculative increment of totalConnections - return false; + else { + totalConnections.decrementAndGet(); // Pool is maxed out, so undo speculative increment of totalConnections + lastConnectionFailure.set(new SQLException("HikariCP pool is at maximum capacity")); + return true; + } } /** @@ -644,7 +645,7 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener closeConnection(bagEntry, "connection evicted"); } else if (idleTimeout > 0L && now > bagEntry.lastAccess + idleTimeout) { - closeConnection(bagEntry, "connection passed idleTimeout"); + closeConnection(bagEntry, "connection passed idleTimeout"); } else { connectionBag.unreserve(bagEntry); From ff9d5ff86520398da6bf0425d7e225b043fbec1b Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 22:17:30 +0900 Subject: [PATCH 32/40] More improved logging. --- src/main/java/com/zaxxer/hikari/pool/HikariPool.java | 5 +++-- src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 32af2574..8dce8812 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -457,19 +457,20 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener connectionBag.add(new PoolBagEntry(connection, this)); lastConnectionFailure.set(null); + LOGGER.debug("Connection {} added to pool {} ", connection, configuration.getPoolName()); return true; } catch (Exception e) { totalConnections.decrementAndGet(); // We failed so undo speculative increment of totalConnections lastConnectionFailure.set(e); - LOGGER.debug("Connection attempt to database {} failed: {}", configuration.getPoolName(), e.getMessage(), e); + LOGGER.debug("Connection attempt to database in pool {} failed: {}", configuration.getPoolName(), e.getMessage(), e); poolUtils.quietlyCloseConnection(connection, "exception during connection creation"); return false; } } else { totalConnections.decrementAndGet(); // Pool is maxed out, so undo speculative increment of totalConnections - lastConnectionFailure.set(new SQLException("HikariCP pool is at maximum capacity")); + lastConnectionFailure.set(new SQLException(String.format("HikariCP pool %s is at maximum capacity", configuration.getPoolName()))); return true; } } diff --git a/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java b/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java index 8a2c7db9..943f4a6c 100644 --- a/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolUtilities.java @@ -49,15 +49,16 @@ public final class PoolUtilities */ public void quietlyCloseConnection(final Connection connection, final String closureReason) { + final String addendum = closureReason != null ? " (" + closureReason + ")" : ""; try { - LOGGER.debug("Closing connection {} {}", connection, (closureReason != null ? "(" + closureReason + ")" : "")); + LOGGER.debug("Closing connection {} in pool {}{}", connection, poolName, addendum); if (connection != null && !connection.isClosed()) { setNetworkTimeout(connection, TimeUnit.SECONDS.toMillis(30)); connection.close(); } } catch (Throwable e) { - LOGGER.debug("{} - Exception closing connection {}", poolName, connection.toString(), e); + LOGGER.debug("Exception closing connection {} in pool {}{}", connection.toString(), poolName, addendum, e); } } From b9b11d914cc41a44aa9db0b568b522b8c72d2a03 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 22:32:34 +0900 Subject: [PATCH 33/40] Change travis-ci configuration for master --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2b1b3a72..923c531e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,5 +7,3 @@ install: /bin/true script: - mvn install -Dskip.unit.tests=true -Dmaven.javadoc.skip=true -V -B - mvn clean test coveralls:report -V -pl hikaricp -P coverage - - jdk_switcher use openjdk6 - - mvn test -V -pl hikaricp-java6 From 4e7a103c27dbfa5f63598035e523fbacd51ed277 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 22:35:50 +0900 Subject: [PATCH 34/40] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 923c531e..81adbcef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,4 +6,4 @@ install: /bin/true script: - mvn install -Dskip.unit.tests=true -Dmaven.javadoc.skip=true -V -B - - mvn clean test coveralls:report -V -pl hikaricp -P coverage + - mvn clean test coveralls:report -V -P coverage From f44275934839a680378d0c75a85897eca87b039d Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 22:41:41 +0900 Subject: [PATCH 35/40] Added profile for coveralls --- pom.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pom.xml b/pom.xml index 5ddf0daf..e5f0c799 100644 --- a/pom.xml +++ b/pom.xml @@ -288,6 +288,29 @@
+ + coverage + + + + org.eluder.coveralls + coveralls-maven-plugin + 3.0.1 + + + coveralls + verify + + jacoco + + false + + + + + + + release-sign-artifacts From 33fde76e46ed2e91537d4a757869fe55f65cbbfd Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 23:45:43 +0900 Subject: [PATCH 36/40] Added jacoco to pom --- pom.xml | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index e5f0c799..8991289b 100644 --- a/pom.xml +++ b/pom.xml @@ -157,6 +157,57 @@ + + org.jacoco + jacoco-maven-plugin + 0.7.4.201502262128 + + + + pre-unit-test + + prepare-agent + + + + ${project.build.directory}/coverage-reports/jacoco.exec + + surefireArgLine + + **/com/zaxxer/hikari/proxy/ProxyFactory + **/com/zaxxer/hikari/proxy/ResultSetProxy + **/com/zaxxer/hikari/proxy/StatementProxy + **/com/zaxxer/hikari/proxy/CallableStatementProxy + **/com/zaxxer/hikari/proxy/PreparedStatementProxy + **/com/zaxxer/hikari/metrics/** + + + + + + post-unit-test + test + + report + + + + ${project.build.directory}/coverage-reports/jacoco.exec + + ${project.reporting.outputDirectory}/jacoco + + **/com/zaxxer/hikari/proxy/ProxyFactory.class + **/com/zaxxer/hikari/proxy/ResultSetProxy.class + **/com/zaxxer/hikari/proxy/StatementProxy.class + **/com/zaxxer/hikari/proxy/CallableStatementProxy.class + **/com/zaxxer/hikari/proxy/PreparedStatementProxy.class + **/com/zaxxer/hikari/metrics/** + + + + + + org.apache.felix maven-bundle-plugin @@ -236,9 +287,9 @@ maven-surefire-plugin 2.15 - + ${surefireArgLine} - + ${skip.unit.tests} @@ -248,8 +299,8 @@ maven-source-plugin 2.2.1 - + true @@ -268,7 +319,7 @@ 2.9.1 public - + true 1024m @@ -295,7 +346,7 @@ org.eluder.coveralls coveralls-maven-plugin - 3.0.1 + 3.1.0 coveralls From 789e2a07742a625fb53e0dff67d5ff733ae201a0 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 23:51:15 +0900 Subject: [PATCH 37/40] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 01a2e764..2de97b53 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)](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://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)](http://issuestats.com/github/brettwooldridge/HikariCP)[![Coverage Status](https://img.shields.io/coveralls/brettwooldridge/HikariCP/master.svg)](https://coveralls.io/r/brettwooldridge/HikariCP?branch=master)
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 b05e34275f533024baf83d20a42f21517e1d9a51 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 23:59:24 +0900 Subject: [PATCH 38/40] Exclude PoolInitializationException from coverage --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 8991289b..6a25fe6c 100644 --- a/pom.xml +++ b/pom.xml @@ -179,6 +179,7 @@ **/com/zaxxer/hikari/proxy/StatementProxy **/com/zaxxer/hikari/proxy/CallableStatementProxy **/com/zaxxer/hikari/proxy/PreparedStatementProxy + **/com/zaxxer/hikari/pool/PoolInitializationException **/com/zaxxer/hikari/metrics/** @@ -201,6 +202,7 @@ **/com/zaxxer/hikari/proxy/StatementProxy.class **/com/zaxxer/hikari/proxy/CallableStatementProxy.class **/com/zaxxer/hikari/proxy/PreparedStatementProxy.class + **/com/zaxxer/hikari/pool/PoolInitializationException.class **/com/zaxxer/hikari/metrics/** From eeb56f36f8c16f19a1e4631ea49eb8e3516d99c0 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 23:59:56 +0900 Subject: [PATCH 39/40] Remove multi-pool (DataSource.getConnection(username, password) support. --- .../com/zaxxer/hikari/HikariDataSource.java | 77 ++----------------- 1 file changed, 5 insertions(+), 72 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/HikariDataSource.java b/src/main/java/com/zaxxer/hikari/HikariDataSource.java index 6a6b3f59..f80dc7f2 100644 --- a/src/main/java/com/zaxxer/hikari/HikariDataSource.java +++ b/src/main/java/com/zaxxer/hikari/HikariDataSource.java @@ -22,7 +22,6 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.sql.Wrapper; -import java.util.HashMap; import javax.sql.DataSource; @@ -44,9 +43,6 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea { private static final Logger LOGGER = LoggerFactory.getLogger(HikariDataSource.class); - // We use a concrete HashMap rather than Map to avoid an invokeinterface callsite - private final HashMap multiPool; - private volatile boolean isShutdown; private final HikariPool fastPathPool; @@ -62,7 +58,6 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea { super(); fastPathPool = null; - multiPool = new HashMap(); } /** @@ -74,11 +69,9 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea { configuration.validate(); configuration.copyState(this); - multiPool = new HashMap(); LOGGER.info("HikariCP pool {} is starting.", configuration.getPoolName()); pool = fastPathPool = new HikariPool(this); - multiPool.put(new MultiPoolKey(getUsername(), getPassword()), pool); } /** {@inheritDoc} */ @@ -102,7 +95,6 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea validate(); LOGGER.info("HikariCP pool {} is starting.", getPoolName()); pool = result = new HikariPool(this); - multiPool.put(new MultiPoolKey(getUsername(), getPassword()), pool); } } } @@ -112,25 +104,9 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea /** {@inheritDoc} */ @Override - @Deprecated public Connection getConnection(String username, String password) throws SQLException { - if (isShutdown) { - throw new SQLException("Pool has been shutdown"); - } - - final MultiPoolKey key = new MultiPoolKey(username, password); - - HikariPool hikariPool; - synchronized (multiPool) { - hikariPool = multiPool.get(key); - if (hikariPool == null) { - hikariPool = new HikariPool(this, username, password); - multiPool.put(key, hikariPool); - } - } - - return hikariPool.getConnection(); + throw new SQLFeatureNotSupportedException(); } /** {@inheritDoc} */ @@ -153,18 +129,15 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea @Override public void setLoginTimeout(int seconds) throws SQLException { - for (HikariPool hikariPool : multiPool.values()) { - hikariPool.getDataSource().setLoginTimeout(seconds); - } + pool.getDataSource().setLoginTimeout(seconds); } /** {@inheritDoc} */ @Override public int getLoginTimeout() throws SQLException { - HikariPool hikariPool = multiPool.values().iterator().next(); - if (hikariPool != null) { - return hikariPool.getDataSource().getLoginTimeout(); + if (pool != null) { + return pool.getDataSource().getLoginTimeout(); } return 0; @@ -311,9 +284,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea shutdownHelper(fastPathPool); } - for (HikariPool hikariPool : multiPool.values()) { - shutdownHelper(hikariPool); - } + shutdownHelper(pool); } /** {@inheritDoc} */ @@ -336,42 +307,4 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea ((DriverDataSource) hPool.getDataSource()).shutdown(); } } - - private static class MultiPoolKey - { - private String username; - private String password; - - MultiPoolKey(String username, String password) - { - this.username = username; - this.password = password; - } - - @Override - public int hashCode() - { - return (password == null ? 0 : password.hashCode()); - } - - @Override - public boolean equals(Object obj) - { - MultiPoolKey otherKey = ((MultiPoolKey) obj); - if (username != null && !username.equals(otherKey.username)) { - return false; - } - else if (username == null && otherKey.username != null) { - return false; - } - else if (password != null && !password.equals(otherKey.password)) { - return false; - } - else if (password == null && otherKey.password != null) { - return false; - } - - return true; - } - } } From b08b0d76566e4a0c45be7b63ef4403147d697166 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sun, 29 Mar 2015 00:10:11 +0900 Subject: [PATCH 40/40] Fix test breakage, plus some minor cleanup. --- .../com/zaxxer/hikari/pool/HikariPool.java | 19 +++-------- .../com/zaxxer/hikari/JdbcDriverTest.java | 4 --- .../java/com/zaxxer/hikari/ShutdownTest.java | 12 ------- .../com/zaxxer/hikari/TestConnections.java | 34 ------------------- 4 files changed, 4 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 8dce8812..0c68de4d 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -106,23 +106,12 @@ public class HikariPool implements HikariPoolMBean, IBagStateListener /** * Construct a HikariPool with the specified configuration. * - * @param configuration a HikariConfig instance - */ - public HikariPool(HikariConfig configuration) { - this(configuration, configuration.getUsername(), configuration.getPassword()); - } - - /** - * Construct a HikariPool with the specified configuration. We cache lots of configuration - * items in class-local final members for speed. - * * @param config a HikariConfig instance - * @param username authentication username - * @param password authentication password */ - public HikariPool(HikariConfig config, String username, String password) { - this.username = username; - this.password = password; + public HikariPool(HikariConfig config) + { + this.username = config.getUsername(); + this.password = config.getPassword(); this.configuration = config; this.poolUtils = new PoolUtilities(config); diff --git a/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java b/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java index 8ccaca2c..bf03cc2a 100644 --- a/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java +++ b/src/test/java/com/zaxxer/hikari/JdbcDriverTest.java @@ -36,7 +36,6 @@ public class JdbcDriverTest } } - @SuppressWarnings("deprecation") @Test public void driverTest1() throws SQLException { @@ -58,9 +57,6 @@ public class JdbcDriverTest Connection connection = ds.getConnection(); connection.close(); - - connection = ds.getConnection("foo", "bar"); - connection.close(); } @Test diff --git a/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/src/test/java/com/zaxxer/hikari/ShutdownTest.java index 8b12e55e..17803b36 100644 --- a/src/test/java/com/zaxxer/hikari/ShutdownTest.java +++ b/src/test/java/com/zaxxer/hikari/ShutdownTest.java @@ -205,7 +205,6 @@ public class ShutdownTest Assert.assertSame("Total connection count not as expected", 0, pool.getTotalConnections()); } - @SuppressWarnings("deprecation") @Test public void testAfterShutdown() throws Exception { @@ -225,17 +224,6 @@ public class ShutdownTest catch (SQLException e) { Assert.assertTrue(e.getMessage().contains("Pool has been shutdown")); } - - try - { - ds.getConnection("foo", "bar"); - } - catch (SQLException e) { - Assert.assertTrue(e.getMessage().contains("Pool has been shutdown")); - } - finally { - ds.shutdown(); - } } @Test diff --git a/src/test/java/com/zaxxer/hikari/TestConnections.java b/src/test/java/com/zaxxer/hikari/TestConnections.java index ca258efc..5d947504 100644 --- a/src/test/java/com/zaxxer/hikari/TestConnections.java +++ b/src/test/java/com/zaxxer/hikari/TestConnections.java @@ -20,7 +20,6 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.HashMap; import java.util.concurrent.TimeUnit; import org.junit.Assert; @@ -336,39 +335,6 @@ public class TestConnections } } - @SuppressWarnings("deprecation") - @Test - public void testGetWithUsername() throws Exception - { - HikariConfig config = new HikariConfig(); - config.setMinimumIdle(0); - config.setMaximumPoolSize(4); - config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); - - final HikariDataSource ds = new HikariDataSource(config); - try { - Connection connection1 = ds.getConnection("foo", "bar"); - connection1.close(); - - Connection connection2 = ds.getConnection("foo", "bar"); - connection2.close(); - - Assert.assertSame(connection1.unwrap(Connection.class), connection2.unwrap(Connection.class)); - - Connection connection3 = ds.getConnection("faz", "baf"); - connection3.close(); - - HashMap multiPool = TestElf.getMultiPool(ds); - Assert.assertTrue(multiPool.size() > 1); - - Object[] array = multiPool.keySet().toArray(); - Assert.assertNotEquals(array[0], array[1]); - } - finally { - ds.close(); - } - } - @Test public void testOldDriver() throws Exception {