From ded61125fee00a3ed1ed07de13810375184d7a5e Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 28 Mar 2015 00:50:46 +0900 Subject: [PATCH] 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