diff --git a/pom.xml b/pom.xml index c6d2a33a..c7004391 100644 --- a/pom.xml +++ b/pom.xml @@ -171,7 +171,7 @@ - com.zaxxer.hikari.proxy.JavassistProxyFactory + com.zaxxer.hikari.util.JavassistProxyFactory diff --git a/src/main/java/com/zaxxer/hikari/HikariConfig.java b/src/main/java/com/zaxxer/hikari/HikariConfig.java index ece13c8b..b88454f6 100644 --- a/src/main/java/com/zaxxer/hikari/HikariConfig.java +++ b/src/main/java/com/zaxxer/hikari/HikariConfig.java @@ -40,8 +40,8 @@ import org.slf4j.LoggerFactory; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.health.HealthCheckRegistry; import com.zaxxer.hikari.metrics.MetricsTrackerFactory; -import com.zaxxer.hikari.pool.Mediator; import com.zaxxer.hikari.util.PropertyElf; +import com.zaxxer.hikari.util.UtilityElf; public class HikariConfig implements HikariConfigMXBean { @@ -775,7 +775,7 @@ public class HikariConfig implements HikariConfigMXBean } if (transactionIsolationName != null) { - Mediator.getTransactionIsolation(transactionIsolationName); + UtilityElf.getTransactionIsolation(transactionIsolationName); } if (LOGGER.isDebugEnabled() || unitTest) { diff --git a/src/main/java/com/zaxxer/hikari/HikariDataSource.java b/src/main/java/com/zaxxer/hikari/HikariDataSource.java index a6870f45..07c8e061 100644 --- a/src/main/java/com/zaxxer/hikari/HikariDataSource.java +++ b/src/main/java/com/zaxxer/hikari/HikariDataSource.java @@ -30,7 +30,6 @@ import org.slf4j.LoggerFactory; import com.zaxxer.hikari.metrics.MetricsTrackerFactory; import com.zaxxer.hikari.pool.HikariPool; -import com.zaxxer.hikari.proxy.IHikariConnectionProxy; /** * The HikariCP pooled DataSource. @@ -111,7 +110,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea @Override public PrintWriter getLogWriter() throws SQLException { - return (pool != null ? pool.getDataSource().getLogWriter() : null); + return (pool != null ? pool.getUnwrappedDataSource().getLogWriter() : null); } /** {@inheritDoc} */ @@ -119,7 +118,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea public void setLogWriter(PrintWriter out) throws SQLException { if (pool != null) { - pool.getDataSource().setLogWriter(out); + pool.getUnwrappedDataSource().setLogWriter(out); } } @@ -128,7 +127,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea public void setLoginTimeout(int seconds) throws SQLException { if (pool != null) { - pool.getDataSource().setLoginTimeout(seconds); + pool.getUnwrappedDataSource().setLoginTimeout(seconds); } } @@ -136,7 +135,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea @Override public int getLoginTimeout() throws SQLException { - return (pool != null ? pool.getDataSource().getLoginTimeout() : 0); + return (pool != null ? pool.getUnwrappedDataSource().getLoginTimeout() : 0); } /** {@inheritDoc} */ @@ -156,12 +155,12 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea } if (pool != null) { - if (iface.isInstance(pool.getDataSource())) { - return (T) pool.getDataSource(); + if (iface.isInstance(pool.getUnwrappedDataSource())) { + return (T) pool.getUnwrappedDataSource(); } - if (pool.getDataSource() != null) { - return (T) pool.getDataSource().unwrap(iface); + if (pool.getUnwrappedDataSource() != null) { + return (T) pool.getUnwrappedDataSource().unwrap(iface); } } @@ -177,12 +176,12 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea } if (pool != null) { - if (iface.isInstance(pool.getDataSource())) { + if (iface.isInstance(pool.getUnwrappedDataSource())) { return true; } - if (pool.getDataSource() != null) { - return pool.getDataSource().isWrapperFor(iface); + if (pool.getUnwrappedDataSource() != null) { + return pool.getUnwrappedDataSource().isWrapperFor(iface); } } @@ -247,8 +246,8 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea */ public void evictConnection(Connection connection) { - if (!isClosed() && pool != null && connection instanceof IHikariConnectionProxy) { - pool.evictConnection((IHikariConnectionProxy) connection); + if (!isClosed() && pool != null && connection.getClass().getName().startsWith("com.zaxxer.hikari")) { + pool.evictConnection(connection); } } diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 3d0d6283..3ec384fb 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -36,8 +36,6 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import javax.sql.DataSource; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,14 +49,11 @@ import com.zaxxer.hikari.metrics.MetricsTracker; import com.zaxxer.hikari.metrics.MetricsTracker.MetricsContext; import com.zaxxer.hikari.metrics.MetricsTrackerFactory; import com.zaxxer.hikari.metrics.PoolStats; -import com.zaxxer.hikari.pool.Mediators.PoolEntryMediator; -import com.zaxxer.hikari.pool.Mediators.JdbcMediator; -import com.zaxxer.hikari.pool.Mediators.PoolMediator; -import com.zaxxer.hikari.proxy.IHikariConnectionProxy; import com.zaxxer.hikari.util.ClockSource; import com.zaxxer.hikari.util.ConcurrentBag; import com.zaxxer.hikari.util.ConcurrentBag.IBagStateListener; import com.zaxxer.hikari.util.DefaultThreadFactory; +import com.zaxxer.hikari.util.SuspendResumeLock; /** * This is the primary connection pool class that provides the basic @@ -66,7 +61,7 @@ import com.zaxxer.hikari.util.DefaultThreadFactory; * * @author Brett Wooldridge */ -public class HikariPool implements HikariPoolMXBean, IBagStateListener +public class HikariPool extends PoolBase implements HikariPoolMXBean, IBagStateListener { private static final Logger LOGGER = LoggerFactory.getLogger(HikariPool.class); @@ -79,13 +74,12 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener private static final int POOL_SUSPENDED = 1; private static final int POOL_SHUTDOWN = 2; - final HikariConfig config; final ConcurrentBag connectionBag; final ScheduledThreadPoolExecutor houseKeepingExecutorService; - private final JdbcMediator jdbcMediator; - private final PoolMediator poolMediator; - private final PoolEntryMediator entryMediator; +// private final JdbcMediator jdbcMediator; +// private final PoolMediator poolMediator; +// private final PoolEntryMediator entryMediator; private final AtomicInteger totalConnections; private final ThreadPoolExecutor addConnectionExecutor; @@ -95,7 +89,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener private long connectionTimeout; private final String poolName; - private final LeakTask leakTask; + private final ProxyLeakTask leakTask; private final SuspendResumeLock suspendResumeLock; private volatile MetricsTracker metricsTracker; @@ -108,18 +102,17 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener */ public HikariPool(final HikariConfig config) { - this.config = config; + super(config); - final Mediator mediators = new Mediator(this); - this.jdbcMediator = mediators.getJdbcMediator(); - this.poolMediator = mediators.getPoolMediator(); - this.entryMediator = mediators.getConnectionStateMediator(); +// this.jdbcMediator = mediators.getJdbcMediator(); +// this.poolMediator = mediators.getPoolMediator(); +// this.entryMediator = mediators.getConnectionStateMediator(); this.poolName = config.getPoolName(); this.connectionBag = new ConcurrentBag<>(this); this.totalConnections = new AtomicInteger(); this.connectionTimeout = config.getConnectionTimeout(); - this.suspendResumeLock = config.isAllowPoolSuspension() ? new SuspendResumeLock(true) : SuspendResumeLock.FAUX_LOCK; + this.suspendResumeLock = config.isAllowPoolSuspension() ? new SuspendResumeLock() : SuspendResumeLock.FAUX_LOCK; this.addConnectionExecutor = createThreadPoolExecutor(config.getMaximumPoolSize(), "Hikari connection filler (pool " + poolName + ")", config.getThreadFactory(), new ThreadPoolExecutor.DiscardPolicy()); this.closeConnectionExecutor = createThreadPoolExecutor(4, "Hikari connection closer (pool " + poolName + ")", config.getThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); @@ -136,7 +129,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener this.houseKeepingExecutorService.scheduleAtFixedRate(new HouseKeeper(), HOUSEKEEPING_PERIOD_MS, HOUSEKEEPING_PERIOD_MS, TimeUnit.MILLISECONDS); - this.leakTask = new LeakTask(config.getLeakDetectionThreshold(), houseKeepingExecutorService); + this.leakTask = new ProxyLeakTask(config.getLeakDetectionThreshold(), houseKeepingExecutorService); if (config.getMetricsTrackerFactory() != null) { setMetricsTrackerFactory(config.getMetricsTrackerFactory()); @@ -147,7 +140,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener setHealthCheckRegistry(config.getHealthCheckRegistry()); - poolMediator.registerMBeans(); + registerMBeans(this); initializeConnections(); } @@ -185,7 +178,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener } final long now = clockSource.currentTime(); - if (poolEntry.evict || (clockSource.elapsedMillis(poolEntry.lastAccess, now) > ALIVE_BYPASS_WINDOW_MS && !jdbcMediator.isConnectionAlive(poolEntry.connection))) { + if (poolEntry.evict || (clockSource.elapsedMillis(poolEntry.lastAccess, now) > ALIVE_BYPASS_WINDOW_MS && !isConnectionAlive(poolEntry.connection))) { closeConnection(poolEntry, "(connection evicted or dead)"); // Throw away the dead connection and try again timeout = hardTimeout - clockSource.elapsedMillis(startTime, now); } @@ -207,7 +200,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener logPoolState("Timeout failure\t"); String sqlState = null; - final Throwable originalException = jdbcMediator.getLastConnectionFailure(); + final Throwable originalException = getLastConnectionFailure(); if (originalException instanceof SQLException) { sqlState = ((SQLException) originalException).getSQLState(); } @@ -272,14 +265,14 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener assassinExecutor.awaitTermination(5L, TimeUnit.SECONDS); } - poolMediator.shutdownTimeoutExecutor(); + shutdownNetworkTimeoutExecutor(); closeConnectionExecutor.shutdown(); closeConnectionExecutor.awaitTermination(5L, TimeUnit.SECONDS); } finally { logPoolState("After closing\t"); - poolMediator.unregisterMBeans(); + unregisterMBeans(); metricsTracker.close(); } } @@ -289,19 +282,9 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener * * @param proxyConnection the connection to evict */ - public final void evictConnection(IHikariConnectionProxy proxyConnection) - { - softEvictConnection(proxyConnection.getPoolEntry(), "(connection evicted by user)", true /* owner */); - } - - /** - * Get the wrapped DataSource. - * - * @return the wrapped DataSource - */ - public final DataSource getDataSource() + public final void evictConnection(Connection proxyConnection) { - return jdbcMediator.getUnwrappedDataSource(); + softEvictConnection(((ProxyConnection) proxyConnection).getPoolEntry(), "(connection evicted by user)", true /* owner */); } public void setMetricRegistry(Object metricRegistry) @@ -468,7 +451,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener closeConnectionExecutor.execute(new Runnable() { @Override public void run() { - jdbcMediator.quietlyCloseConnection(connection, closureReason); + quietlyCloseConnection(connection, closureReason); } }); } @@ -490,7 +473,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener } try { - final PoolEntry poolEntry = entryMediator.newPoolEntry(); + final PoolEntry poolEntry = newPoolEntry(); connectionBag.add(poolEntry); final long maxLifetime = config.getMaxLifetime(); @@ -548,7 +531,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener poolEntry.connection.abort(assassinExecutor); } catch (Throwable e) { - jdbcMediator.quietlyCloseConnection(poolEntry.connection, "(connection aborted during shutdown)"); + quietlyCloseConnection(poolEntry.connection, "(connection aborted during shutdown)"); } finally { poolEntry.close(); @@ -567,7 +550,7 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener if (config.isInitializationFailFast()) { try { if (!addConnection()) { - throw jdbcMediator.getLastConnectionFailure(); + throw getLastConnectionFailure(); } final PoolEntry poolEntry = connectionBag.borrow(connectionTimeout, TimeUnit.MILLISECONDS); @@ -667,4 +650,18 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener fillPool(); // Try to maintain minimum connections } } + + public static class PoolInitializationException extends RuntimeException + { + private static final long serialVersionUID = 929872118275916520L; + + /** + * Construct an exception, possibly wrapping the provided Throwable as the cause. + * @param t the Throwable to wrap + */ + public PoolInitializationException(Throwable t) + { + super("Exception during pool initialization: " + t.getMessage(), t); + } + } } diff --git a/src/main/java/com/zaxxer/hikari/pool/PoolBase.java b/src/main/java/com/zaxxer/hikari/pool/PoolBase.java index 495d32c0..64bf8748 100644 --- a/src/main/java/com/zaxxer/hikari/pool/PoolBase.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolBase.java @@ -3,7 +3,6 @@ package com.zaxxer.hikari.pool; import static com.zaxxer.hikari.util.UtilityElf.createInstance; import java.lang.management.ManagementFactory; -import java.lang.reflect.Field; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; @@ -23,17 +22,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.pool.Mediators.PoolEntryMediator; -import com.zaxxer.hikari.pool.Mediators.JdbcMediator; -import com.zaxxer.hikari.pool.Mediators.PoolMediator; -import com.zaxxer.hikari.proxy.ConnectionState; import com.zaxxer.hikari.util.DefaultThreadFactory; import com.zaxxer.hikari.util.DriverDataSource; import com.zaxxer.hikari.util.PropertyElf; +import com.zaxxer.hikari.util.UtilityElf; -public final class Mediator implements Mediators, JdbcMediator, PoolMediator, PoolEntryMediator +abstract class PoolBase { - private static final Logger LOGGER = LoggerFactory.getLogger(Mediator.class); + protected final Logger LOGGER = LoggerFactory.getLogger(getClass()); + protected final HikariConfig config; + private static final String[] RESET_STATES = {"readOnly", "autoCommit", "isolation", "catalog", "netTimeout"}; private static final int UNINITIALIZED = -1; private static final int TRUE = 1; @@ -46,8 +44,7 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po private Executor netTimeoutExecutor; private DataSource dataSource; - private final HikariPool hikariPool; - private final HikariConfig config; + // private final HikariPool hikariPool; private final String poolName; private final String catalog; private final boolean isReadOnly; @@ -58,16 +55,15 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po private volatile boolean isValidChecked; - public Mediator(final HikariPool pool) + public PoolBase(final HikariConfig config) { - this.hikariPool = pool; - this.config = pool.config; + this.config = config; this.networkTimeout = -1; this.catalog = config.getCatalog(); this.isReadOnly = config.isReadOnly(); this.isAutoCommit = config.isAutoCommit(); - this.transactionIsolation = getTransactionIsolation(config.getTransactionIsolation()); + this.transactionIsolation = UtilityElf.getTransactionIsolation(config.getTransactionIsolation()); this.isQueryTimeoutSupported = UNINITIALIZED; this.isNetworkTimeoutSupported = UNINITIALIZED; @@ -80,12 +76,17 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po initializeDataSource(); } + public String getPoolName() + { + return poolName; + } + + abstract void releaseConnection(final PoolEntry poolEntry); + // *********************************************************************** - // JdbcMediator methods + // JDBC methods // *********************************************************************** - /** {@inheritDoc} */ - @Override public void quietlyCloseConnection(final Connection connection, final String closureReason) { try { @@ -107,8 +108,6 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po } } - /** {@inheritDoc} */ - @Override public boolean isConnectionAlive(final Connection connection) { try { @@ -143,15 +142,11 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po } } - /** {@inheritDoc} */ - @Override public DataSource getUnwrappedDataSource() { return dataSource; } - /** {@inheritDoc} */ - @Override public Throwable getLastConnectionFailure() { return lastConnectionFailure.getAndSet(null); @@ -159,17 +154,15 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po // *********************************************************************** - // ConnectionStateMediator methods + // PoolEntry methods // *********************************************************************** - /** {@inheritDoc} */ - @Override public PoolEntry newPoolEntry() throws Exception { - return new PoolEntry(newConnection(), hikariPool, this); + return new PoolEntry(newConnection(), this); } - public void resetConnectionState(final Connection connection, final ConnectionState liveState, final int dirtyBits) throws SQLException + public void resetConnectionState(final Connection connection, final ProxyConnection liveState, final int dirtyBits) throws SQLException { int resetBits = 0; @@ -216,7 +209,7 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po * * @param pool a HikariPool instance */ - public void registerMBeans() + public void registerMBeans(final HikariPool hikariPool) { if (!config.isRegisterMbeans()) { return; @@ -264,79 +257,13 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po } } - public void shutdownTimeoutExecutor() + public void shutdownNetworkTimeoutExecutor() { if (netTimeoutExecutor != null && netTimeoutExecutor instanceof ThreadPoolExecutor) { ((ThreadPoolExecutor) netTimeoutExecutor).shutdownNow(); } } - // *********************************************************************** - // Mediators accessors - // *********************************************************************** - - /** {@inheritDoc} */ - @Override - public JdbcMediator getJdbcMediator() - { - return this; - } - - - /** {@inheritDoc} */ - @Override - public PoolEntryMediator getConnectionStateMediator() - { - return this; - } - - - /** {@inheritDoc} */ - @Override - public PoolMediator getPoolMediator() - { - return this; - } - - // *********************************************************************** - // Misc. public methods - // *********************************************************************** - - /** - * Get the int value of a transaction isolation level by name. - * - * @param transactionIsolationName the name of the transaction isolation level - * @return the int value of the isolation level or -1 - */ - public static int getTransactionIsolation(final String transactionIsolationName) - { - if (transactionIsolationName != null) { - try { - final String upperName = transactionIsolationName.toUpperCase(); - if (upperName.startsWith("TRANSACTION_")) { - Field field = Connection.class.getField(upperName); - return field.getInt(null); - } - final int level = Integer.parseInt(transactionIsolationName); - switch (level) { - case Connection.TRANSACTION_READ_UNCOMMITTED: - case Connection.TRANSACTION_READ_COMMITTED: - case Connection.TRANSACTION_REPEATABLE_READ: - case Connection.TRANSACTION_SERIALIZABLE: - case Connection.TRANSACTION_NONE: - return level; - default: - throw new IllegalArgumentException(); - } - } - catch (Exception e) { - throw new IllegalArgumentException("Invalid transaction isolation value: " + transactionIsolationName); - } - } - - return -1; - } - // *********************************************************************** // Private methods // *********************************************************************** @@ -571,7 +498,7 @@ public final class Mediator implements Mediators, JdbcMediator, PoolMediator, Po command.run(); } catch (Throwable t) { - LOGGER.debug("Exception executing {}", command, t); + LoggerFactory.getLogger(PoolBase.class).debug("Exception executing {}", command, t); } } } diff --git a/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java b/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java index 21a610cb..4a60cd3a 100644 --- a/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java @@ -26,9 +26,6 @@ import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.zaxxer.hikari.pool.Mediators.PoolEntryMediator; -import com.zaxxer.hikari.proxy.ConnectionState; -import com.zaxxer.hikari.proxy.ProxyFactory; import com.zaxxer.hikari.util.ClockSource; import com.zaxxer.hikari.util.ConcurrentBag.IConcurrentBagEntry; import com.zaxxer.hikari.util.FastList; @@ -52,8 +49,7 @@ public final class PoolEntry implements IConcurrentBagEntry public volatile boolean evict; private final FastList openStatements; - private final HikariPool hikariPool; - private final PoolEntryMediator stateMediator; + private final PoolBase poolBase; private final AtomicInteger state; private volatile ScheduledFuture endOfLife; @@ -64,15 +60,14 @@ public final class PoolEntry implements IConcurrentBagEntry DATE_FORMAT = new SimpleDateFormat("MMM dd, HH:mm:ss.SSS"); } - PoolEntry(final Connection connection, final HikariPool pool, final PoolEntryMediator stateMediator) + PoolEntry(final Connection connection, final PoolBase pool) { this.connection = connection; - this.hikariPool = pool; + this.poolBase = pool; this.creationTime = System.currentTimeMillis(); this.state = new AtomicInteger(STATE_NOT_IN_USE); this.lastAccess = ClockSource.INSTANCE.currentTime(); this.openStatements = new FastList<>(Statement.class, 16); - this.stateMediator = stateMediator; } /** @@ -83,7 +78,7 @@ public final class PoolEntry implements IConcurrentBagEntry public void recycle(final long lastAccess) { this.lastAccess = lastAccess; - hikariPool.releaseConnection(this); + poolBase.releaseConnection(this); } /** @@ -94,19 +89,19 @@ public final class PoolEntry implements IConcurrentBagEntry this.endOfLife = endOfLife; } - Connection createProxyConnection(final LeakTask leakTask, final long now) + Connection createProxyConnection(final ProxyLeakTask leakTask, final long now) { return ProxyFactory.getProxyConnection(this, connection, openStatements, leakTask, now); } - public void resetConnectionState(final ConnectionState connectionState, final int dirtyBits) throws SQLException + public void resetConnectionState(final ProxyConnection liveState, final int dirtyBits) throws SQLException { - stateMediator.resetConnectionState(connection, connectionState, dirtyBits); + poolBase.resetConnectionState(connection, liveState, dirtyBits); } public String getPoolName() { - return hikariPool.config.getPoolName(); + return poolBase.getPoolName(); } public Connection getConnection() diff --git a/src/main/java/com/zaxxer/hikari/pool/ProxyCallableStatement.java b/src/main/java/com/zaxxer/hikari/pool/ProxyCallableStatement.java index e6d59d44..922be53c 100644 --- a/src/main/java/com/zaxxer/hikari/pool/ProxyCallableStatement.java +++ b/src/main/java/com/zaxxer/hikari/pool/ProxyCallableStatement.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.zaxxer.hikari.proxy; +package com.zaxxer.hikari.pool; import java.sql.CallableStatement; @@ -23,9 +23,9 @@ import java.sql.CallableStatement; * * @author Brett Wooldridge */ -public abstract class CallableStatementProxy extends PreparedStatementProxy implements CallableStatement +public abstract class ProxyCallableStatement extends ProxyPreparedStatement implements CallableStatement { - protected CallableStatementProxy(ConnectionProxy connection, CallableStatement statement) + protected ProxyCallableStatement(ProxyConnection connection, CallableStatement statement) { super(connection, statement); } diff --git a/src/main/java/com/zaxxer/hikari/pool/ProxyConnection.java b/src/main/java/com/zaxxer/hikari/pool/ProxyConnection.java index 07a1055f..c7778bca 100644 --- a/src/main/java/com/zaxxer/hikari/pool/ProxyConnection.java +++ b/src/main/java/com/zaxxer/hikari/pool/ProxyConnection.java @@ -14,8 +14,11 @@ * limitations under the License. */ -package com.zaxxer.hikari.proxy; +package com.zaxxer.hikari.pool; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; @@ -30,8 +33,6 @@ import java.util.concurrent.Executor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.zaxxer.hikari.pool.LeakTask; -import com.zaxxer.hikari.pool.PoolEntry; import com.zaxxer.hikari.util.ClockSource; import com.zaxxer.hikari.util.FastList; @@ -40,7 +41,7 @@ import com.zaxxer.hikari.util.FastList; * * @author Brett Wooldridge */ -public abstract class ConnectionProxy implements IHikariConnectionProxy, ConnectionState +public abstract class ProxyConnection implements Connection { private static final Logger LOGGER; private static final Set SQL_ERRORS; @@ -48,7 +49,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy, Connect protected Connection delegate; - private final LeakTask leakTask; + private final ProxyLeakTask leakTask; private final PoolEntry poolEntry; private final FastList openStatements; @@ -64,7 +65,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy, Connect // static initializer static { - LOGGER = LoggerFactory.getLogger(ConnectionProxy.class); + LOGGER = LoggerFactory.getLogger(ProxyConnection.class); clockSource = ClockSource.INSTANCE; SQL_ERRORS = new HashSet<>(); @@ -76,7 +77,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy, Connect SQL_ERRORS.add("JZ0C1"); // Sybase disconnect error } - protected ConnectionProxy(final PoolEntry poolEntry, final Connection connection, final FastList openStatements, final LeakTask leakTask, final long now) { + protected ProxyConnection(final PoolEntry poolEntry, final Connection connection, final FastList openStatements, final ProxyLeakTask leakTask, final long now) { this.poolEntry = poolEntry; this.delegate = connection; this.openStatements = openStatements; @@ -95,39 +96,29 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy, Connect } // *********************************************************************** - // ConnectionState methods + // Live Connection State accessors // *********************************************************************** - /** {@inheritDoc} */ - @Override public final boolean getAutoCommitState() { return isAutoCommit; } - /** {@inheritDoc} */ - @Override public final String getCatalogState() { return dbcatalog; } - /** {@inheritDoc} */ - @Override public final int getTransactionIsolationState() { return transactionIsolation; } - /** {@inheritDoc} */ - @Override public final boolean getReadOnlyState() { return isReadOnly; } - /** {@inheritDoc} */ - @Override public final int getNetworkTimeoutState() { return networkTimeout; @@ -138,14 +129,12 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy, Connect // *********************************************************************** /** {@inheritDoc} */ - @Override public final PoolEntry getPoolEntry() { return poolEntry; } /** {@inheritDoc} */ - @Override public final SQLException checkException(final SQLException sqle) { String sqlState = sqle.getSQLState(); @@ -167,14 +156,12 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy, Connect } /** {@inheritDoc} */ - @Override public final void untrackStatement(final Statement statement) { openStatements.remove(statement); } /** {@inheritDoc} */ - @Override public final void markCommitStateDirty() { if (isAutoCommit) { @@ -217,7 +204,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy, Connect } // ********************************************************************** - // "Overridden" java.sql.Connection Methods + // "Overridden" java.sql.Connection Methods // ********************************************************************** /** {@inheritDoc} */ @@ -439,4 +426,38 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy, Connect throw new SQLException("Wrapped connection is not an instance of " + iface); } + + // ********************************************************************** + // Private classes + // ********************************************************************** + + private static final class ClosedConnection + { + static final Connection CLOSED_CONNECTION = getClosedConnection(); + + private static Connection getClosedConnection() + { + InvocationHandler handler = new InvocationHandler() { + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable + { + final String methodName = method.getName(); + if ("abort".equals(methodName)) { + return Void.TYPE; + } + else if ("isValid".equals(methodName)) { + return Boolean.FALSE; + } + else if ("toString".equals(methodName)) { + return ClosedConnection.class.getCanonicalName(); + } + + throw new SQLException("Connection is closed"); + } + }; + + return (Connection) Proxy.newProxyInstance(Connection.class.getClassLoader(), new Class[] { Connection.class }, handler); + } + } } diff --git a/src/main/java/com/zaxxer/hikari/pool/ProxyFactory.java b/src/main/java/com/zaxxer/hikari/pool/ProxyFactory.java index be7bcb04..181e07db 100644 --- a/src/main/java/com/zaxxer/hikari/pool/ProxyFactory.java +++ b/src/main/java/com/zaxxer/hikari/pool/ProxyFactory.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.zaxxer.hikari.proxy; +package com.zaxxer.hikari.pool; import java.sql.CallableStatement; import java.sql.Connection; @@ -22,8 +22,6 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; -import com.zaxxer.hikari.pool.LeakTask; -import com.zaxxer.hikari.pool.PoolEntry; import com.zaxxer.hikari.util.FastList; /** @@ -49,31 +47,31 @@ public final class ProxyFactory * @param now current timestamp in milliseconds * @return a proxy that wraps the specified {@link Connection} */ - public static IHikariConnectionProxy getProxyConnection(final PoolEntry poolEntry, final Connection connection, final FastList openStatements, final LeakTask leakTask, final long now) + static ProxyConnection getProxyConnection(final PoolEntry poolEntry, final Connection connection, final FastList openStatements, final ProxyLeakTask leakTask, final long now) { // Body is replaced (injected) by JavassistProxyFactory throw new IllegalStateException("You need to run the CLI build and you need target/classes in your classpath to run."); } - static Statement getProxyStatement(final ConnectionProxy connection, final Statement statement) + static Statement getProxyStatement(final ProxyConnection connection, final Statement statement) { // Body is replaced (injected) by JavassistProxyFactory throw new IllegalStateException("You need to run the CLI build and you need target/classes in your classpath to run."); } - static CallableStatement getProxyCallableStatement(final ConnectionProxy connection, final CallableStatement statement) + static CallableStatement getProxyCallableStatement(final ProxyConnection connection, final CallableStatement statement) { // Body is replaced (injected) by JavassistProxyFactory throw new IllegalStateException("You need to run the CLI build and you need target/classes in your classpath to run."); } - static PreparedStatement getProxyPreparedStatement(final ConnectionProxy connection, final PreparedStatement statement) + static PreparedStatement getProxyPreparedStatement(final ProxyConnection connection, final PreparedStatement statement) { // Body is replaced (injected) by JavassistProxyFactory throw new IllegalStateException("You need to run the CLI build and you need target/classes in your classpath to run."); } - static ResultSet getProxyResultSet(final ConnectionProxy connection, final StatementProxy statement, final ResultSet resultSet) + static ResultSet getProxyResultSet(final ProxyConnection connection, final ProxyStatement statement, final ResultSet resultSet) { // Body is replaced (injected) by JavassistProxyFactory throw new IllegalStateException("You need to run the CLI build and you need target/classes in your classpath to run."); diff --git a/src/main/java/com/zaxxer/hikari/pool/ProxyLeakTask.java b/src/main/java/com/zaxxer/hikari/pool/ProxyLeakTask.java index 7a57e2e4..ee37d952 100644 --- a/src/main/java/com/zaxxer/hikari/pool/ProxyLeakTask.java +++ b/src/main/java/com/zaxxer/hikari/pool/ProxyLeakTask.java @@ -29,10 +29,10 @@ import org.slf4j.LoggerFactory; * * @author Brett Wooldridge */ -public class LeakTask implements Runnable +class ProxyLeakTask implements Runnable { - private static final Logger LOGGER = LoggerFactory.getLogger(LeakTask.class); - private static final LeakTask NO_LEAK; + private static final Logger LOGGER = LoggerFactory.getLogger(ProxyLeakTask.class); + private static final ProxyLeakTask NO_LEAK; private ScheduledExecutorService executorService; private long leakDetectionThreshold; @@ -42,32 +42,32 @@ public class LeakTask implements Runnable static { - NO_LEAK = new LeakTask() { + NO_LEAK = new ProxyLeakTask() { @Override public void cancel() {} }; } - LeakTask(final long leakDetectionThreshold, final ScheduledExecutorService executorService) + ProxyLeakTask(final long leakDetectionThreshold, final ScheduledExecutorService executorService) { this.executorService = executorService; this.leakDetectionThreshold = leakDetectionThreshold; } - private LeakTask(final LeakTask parent, final PoolEntry poolEntry) + private ProxyLeakTask(final ProxyLeakTask parent, final PoolEntry poolEntry) { this.exception = new Exception("Apparent connection leak detected"); this.connectionName = poolEntry.connection.toString(); scheduledFuture = parent.executorService.schedule(this, parent.leakDetectionThreshold, TimeUnit.MILLISECONDS); } - private LeakTask() + private ProxyLeakTask() { } - LeakTask start(final PoolEntry bagEntry) + ProxyLeakTask start(final PoolEntry bagEntry) { - return (leakDetectionThreshold == 0) ? NO_LEAK : new LeakTask(this, bagEntry); + return (leakDetectionThreshold == 0) ? NO_LEAK : new ProxyLeakTask(this, bagEntry); } void updateLeakDetectionThreshold(final long leakDetectionThreshold) diff --git a/src/main/java/com/zaxxer/hikari/pool/ProxyPreparedStatement.java b/src/main/java/com/zaxxer/hikari/pool/ProxyPreparedStatement.java index f05bb702..e2d96c99 100644 --- a/src/main/java/com/zaxxer/hikari/pool/ProxyPreparedStatement.java +++ b/src/main/java/com/zaxxer/hikari/pool/ProxyPreparedStatement.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.zaxxer.hikari.proxy; +package com.zaxxer.hikari.pool; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -25,9 +25,9 @@ import java.sql.SQLException; * * @author Brett Wooldridge */ -public abstract class PreparedStatementProxy extends StatementProxy implements PreparedStatement +public abstract class ProxyPreparedStatement extends ProxyStatement implements PreparedStatement { - protected PreparedStatementProxy(ConnectionProxy connection, PreparedStatement statement) + protected ProxyPreparedStatement(ProxyConnection connection, PreparedStatement statement) { super(connection, statement); } diff --git a/src/main/java/com/zaxxer/hikari/pool/ProxyResultSet.java b/src/main/java/com/zaxxer/hikari/pool/ProxyResultSet.java index a7f8df27..3aa1b622 100644 --- a/src/main/java/com/zaxxer/hikari/pool/ProxyResultSet.java +++ b/src/main/java/com/zaxxer/hikari/pool/ProxyResultSet.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.zaxxer.hikari.proxy; +package com.zaxxer.hikari.pool; import java.sql.ResultSet; import java.sql.SQLException; @@ -26,13 +26,13 @@ import java.sql.Wrapper; * * @author Brett Wooldridge */ -public abstract class ResultSetProxy implements ResultSet +public abstract class ProxyResultSet implements ResultSet { - protected final ConnectionProxy connection; - protected final StatementProxy statement; + protected final ProxyConnection connection; + protected final ProxyStatement statement; protected final ResultSet delegate; - protected ResultSetProxy(ConnectionProxy connection, StatementProxy statement, ResultSet resultSet) + protected ProxyResultSet(ProxyConnection connection, ProxyStatement statement, ResultSet resultSet) { this.connection = connection; this.statement = statement; diff --git a/src/main/java/com/zaxxer/hikari/pool/ProxyStatement.java b/src/main/java/com/zaxxer/hikari/pool/ProxyStatement.java index 52ab6324..320dd921 100644 --- a/src/main/java/com/zaxxer/hikari/pool/ProxyStatement.java +++ b/src/main/java/com/zaxxer/hikari/pool/ProxyStatement.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.zaxxer.hikari.proxy; +package com.zaxxer.hikari.pool; import java.sql.Connection; import java.sql.ResultSet; @@ -27,14 +27,14 @@ import java.sql.Wrapper; * * @author Brett Wooldridge */ -public abstract class StatementProxy implements Statement +public abstract class ProxyStatement implements Statement { - protected final ConnectionProxy connection; + protected final ProxyConnection connection; protected final Statement delegate; private boolean isClosed; - protected StatementProxy(ConnectionProxy connection, Statement statement) + protected ProxyStatement(ProxyConnection connection, Statement statement) { this.connection = connection; this.delegate = statement; diff --git a/src/main/java/com/zaxxer/hikari/util/JavassistProxyFactory.java b/src/main/java/com/zaxxer/hikari/util/JavassistProxyFactory.java index 7a42ef9b..ba192e7f 100644 --- a/src/main/java/com/zaxxer/hikari/util/JavassistProxyFactory.java +++ b/src/main/java/com/zaxxer/hikari/util/JavassistProxyFactory.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.zaxxer.hikari.proxy; +package com.zaxxer.hikari.util; import java.lang.reflect.Array; import java.sql.CallableStatement; @@ -28,6 +28,13 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import com.zaxxer.hikari.pool.ProxyCallableStatement; +import com.zaxxer.hikari.pool.ProxyConnection; +import com.zaxxer.hikari.pool.ProxyFactory; +import com.zaxxer.hikari.pool.ProxyPreparedStatement; +import com.zaxxer.hikari.pool.ProxyResultSet; +import com.zaxxer.hikari.pool.ProxyStatement; + import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; @@ -57,14 +64,14 @@ public final class JavassistProxyFactory try { // Cast is not needed for these String methodBody = "{ try { return delegate.method($$); } catch (SQLException e) { throw checkException(e); } }"; - generateProxyClass(Connection.class, ConnectionProxy.class.getName(), methodBody); - generateProxyClass(Statement.class, StatementProxy.class.getName(), methodBody); - generateProxyClass(ResultSet.class, ResultSetProxy.class.getName(), methodBody); + generateProxyClass(Connection.class, ProxyConnection.class.getName(), methodBody); + generateProxyClass(Statement.class, ProxyStatement.class.getName(), methodBody); + generateProxyClass(ResultSet.class, ProxyResultSet.class.getName(), 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.getName(), methodBody); - generateProxyClass(CallableStatement.class, CallableStatementProxy.class.getName(), methodBody); + generateProxyClass(PreparedStatement.class, ProxyPreparedStatement.class.getName(), methodBody); + generateProxyClass(CallableStatement.class, ProxyCallableStatement.class.getName(), methodBody); modifyProxyFactory(); } @@ -77,24 +84,24 @@ public final class JavassistProxyFactory { System.out.println("Generating method bodies for com.zaxxer.hikari.proxy.ProxyFactory"); - String packageName = JavassistProxyFactory.class.getPackage().getName(); - CtClass proxyCt = classPool.getCtClass("com.zaxxer.hikari.proxy.ProxyFactory"); + String packageName = ProxyConnection.class.getPackage().getName(); + CtClass proxyCt = classPool.getCtClass("com.zaxxer.hikari.pool.ProxyFactory"); for (CtMethod method : proxyCt.getMethods()) { switch (method.getName()) { case "getProxyConnection": - method.setBody("{return new " + packageName + ".HikariConnectionProxy($$);}"); + method.setBody("{return new " + packageName + ".HikariProxyConnection($$);}"); break; case "getProxyStatement": - method.setBody("{return new " + packageName + ".HikariStatementProxy($$);}"); + method.setBody("{return new " + packageName + ".HikariProxyStatement($$);}"); break; case "getProxyPreparedStatement": - method.setBody("{return new " + packageName + ".HikariPreparedStatementProxy($$);}"); + method.setBody("{return new " + packageName + ".HikariProxyPreparedStatement($$);}"); break; case "getProxyCallableStatement": - method.setBody("{return new " + packageName + ".HikariCallableStatementProxy($$);}"); + method.setBody("{return new " + packageName + ".HikariProxyCallableStatement($$);}"); break; case "getProxyResultSet": - method.setBody("{return new " + packageName + ".HikariResultSetProxy($$);}"); + method.setBody("{return new " + packageName + ".HikariProxyResultSet($$);}"); break; } } diff --git a/src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java b/src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java index 05f610fb..0be8113f 100644 --- a/src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java +++ b/src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.zaxxer.hikari.pool; +package com.zaxxer.hikari.util; import java.util.concurrent.Semaphore; @@ -25,9 +25,9 @@ import java.util.concurrent.Semaphore; * * @author Brett Wooldridge */ -class SuspendResumeLock +public class SuspendResumeLock { - static final SuspendResumeLock FAUX_LOCK = new SuspendResumeLock(false) { + public static final SuspendResumeLock FAUX_LOCK = new SuspendResumeLock(false) { @Override public void acquire() {} @@ -47,7 +47,13 @@ class SuspendResumeLock /** * Default constructor */ - SuspendResumeLock(final boolean createSemaphore) { + public SuspendResumeLock() + { + this(true); + } + + private SuspendResumeLock(final boolean createSemaphore) + { acquisitionSemaphore = (createSemaphore ? new Semaphore(MAX_PERMITS, true) : null); } diff --git a/src/main/java/com/zaxxer/hikari/util/UtilityElf.java b/src/main/java/com/zaxxer/hikari/util/UtilityElf.java index d6cacff5..65fa7c45 100644 --- a/src/main/java/com/zaxxer/hikari/util/UtilityElf.java +++ b/src/main/java/com/zaxxer/hikari/util/UtilityElf.java @@ -17,6 +17,8 @@ package com.zaxxer.hikari.util; import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.sql.Connection; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadFactory; @@ -100,4 +102,43 @@ public final class UtilityElf executor.allowCoreThreadTimeOut(true); return executor; } + + // *********************************************************************** + // Misc. public methods + // *********************************************************************** + + /** + * Get the int value of a transaction isolation level by name. + * + * @param transactionIsolationName the name of the transaction isolation level + * @return the int value of the isolation level or -1 + */ + public static int getTransactionIsolation(final String transactionIsolationName) + { + if (transactionIsolationName != null) { + try { + final String upperName = transactionIsolationName.toUpperCase(); + if (upperName.startsWith("TRANSACTION_")) { + Field field = Connection.class.getField(upperName); + return field.getInt(null); + } + final int level = Integer.parseInt(transactionIsolationName); + switch (level) { + case Connection.TRANSACTION_READ_UNCOMMITTED: + case Connection.TRANSACTION_READ_COMMITTED: + case Connection.TRANSACTION_REPEATABLE_READ: + case Connection.TRANSACTION_SERIALIZABLE: + case Connection.TRANSACTION_NONE: + return level; + default: + throw new IllegalArgumentException(); + } + } + catch (Exception e) { + throw new IllegalArgumentException("Invalid transaction isolation value: " + transactionIsolationName); + } + } + + return -1; + } } diff --git a/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java b/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java index a2b84207..a93db043 100644 --- a/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java +++ b/src/test/java/com/zaxxer/hikari/ConnectionStateTest.java @@ -8,7 +8,7 @@ import java.sql.Statement; import org.junit.Assert; import org.junit.Test; -import com.zaxxer.hikari.pool.Mediator; +import com.zaxxer.hikari.util.UtilityElf; public class ConnectionStateTest { @@ -70,7 +70,7 @@ public class ConnectionStateTest config.setTransactionIsolation("TRANSACTION_REPEATABLE_READ"); config.validate(); - int transactionIsolation = Mediator.getTransactionIsolation(config.getTransactionIsolation()); + int transactionIsolation = UtilityElf.getTransactionIsolation(config.getTransactionIsolation()); Assert.assertSame(Connection.TRANSACTION_REPEATABLE_READ, transactionIsolation); } diff --git a/src/test/java/com/zaxxer/hikari/MiscTest.java b/src/test/java/com/zaxxer/hikari/MiscTest.java index 089f10c6..b5b872d7 100644 --- a/src/test/java/com/zaxxer/hikari/MiscTest.java +++ b/src/test/java/com/zaxxer/hikari/MiscTest.java @@ -29,8 +29,6 @@ import org.junit.Test; import org.slf4j.spi.LocationAwareLogger; import com.zaxxer.hikari.pool.HikariPool; -import com.zaxxer.hikari.pool.LeakTask; -import com.zaxxer.hikari.pool.Mediator; import com.zaxxer.hikari.util.UtilityElf; /** @@ -66,7 +64,7 @@ public class MiscTest public void testInvalidIsolation() { try { - Mediator.getTransactionIsolation("INVALID"); + UtilityElf.getTransactionIsolation("INVALID"); Assert.fail(); } catch (Exception e) { @@ -87,11 +85,11 @@ public class MiscTest } @Test - public void testLeakDetection() throws SQLException + public void testLeakDetection() throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos, true); - TestElf.setSlf4jTargetStream(LeakTask.class, ps); + TestElf.setSlf4jTargetStream(Class.forName("com.zaxxer.hikari.pool.ProxyLeakTask"), ps); HikariConfig config = new HikariConfig(); config.setMinimumIdle(0); diff --git a/src/test/java/com/zaxxer/hikari/ShutdownTest.java b/src/test/java/com/zaxxer/hikari/ShutdownTest.java index e3315fea..18792c40 100644 --- a/src/test/java/com/zaxxer/hikari/ShutdownTest.java +++ b/src/test/java/com/zaxxer/hikari/ShutdownTest.java @@ -28,7 +28,6 @@ import org.junit.Test; import com.zaxxer.hikari.mocks.StubConnection; import com.zaxxer.hikari.pool.HikariPool; -import com.zaxxer.hikari.pool.Mediator; import com.zaxxer.hikari.util.ClockSource; import com.zaxxer.hikari.util.UtilityElf; @@ -292,7 +291,7 @@ public class ShutdownTest Assert.fail(e.getMessage()); } finally { - new Mediator(TestElf.getPool(ds)).quietlyCloseConnection(connection, "(because this is a test)"); + TestElf.getPool(ds).quietlyCloseConnection(connection, "(because this is a test)"); ds.close(); } }; diff --git a/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java b/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java index 4951fe02..68d7aaac 100644 --- a/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java +++ b/src/test/java/com/zaxxer/hikari/TestConcurrentBag.java @@ -28,7 +28,7 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import com.zaxxer.hikari.pool.Mediator; +import com.zaxxer.hikari.pool.HikariPool; import com.zaxxer.hikari.pool.PoolEntry; import com.zaxxer.hikari.util.ConcurrentBag; import com.zaxxer.hikari.util.ConcurrentBag.IBagStateListener; @@ -40,7 +40,7 @@ import com.zaxxer.hikari.util.ConcurrentBag.IBagStateListener; public class TestConcurrentBag { private static HikariDataSource ds; - private static Mediator mediator; + private static HikariPool pool; @BeforeClass public static void setup() @@ -53,7 +53,7 @@ public class TestConcurrentBag config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); ds = new HikariDataSource(config); - mediator = new Mediator(TestElf.getPool(ds)); + pool = TestElf.getPool(ds); } @AfterClass @@ -104,15 +104,15 @@ public class TestConcurrentBag }); Assert.assertEquals(0, bag.values(8).size()); - PoolEntry reserved = mediator.newPoolEntry(); + PoolEntry reserved = pool.newPoolEntry(); bag.add(reserved); bag.reserve(reserved); // reserved - PoolEntry inuse = mediator.newPoolEntry(); + PoolEntry inuse = pool.newPoolEntry(); bag.add(inuse); bag.borrow(2, TimeUnit.MILLISECONDS); // in use - PoolEntry notinuse = mediator.newPoolEntry(); + PoolEntry notinuse = pool.newPoolEntry(); bag.add(notinuse); // not in use bag.dumpState(); @@ -135,7 +135,7 @@ public class TestConcurrentBag bag.close(); try { - PoolEntry bagEntry = mediator.newPoolEntry(); + PoolEntry bagEntry = pool.newPoolEntry(); bag.add(bagEntry); Assert.assertNotEquals(bagEntry, bag.borrow(100, TimeUnit.MILLISECONDS)); } diff --git a/src/test/java/com/zaxxer/hikari/TestConnections.java b/src/test/java/com/zaxxer/hikari/TestConnections.java index bbb6deb4..009779fb 100644 --- a/src/test/java/com/zaxxer/hikari/TestConnections.java +++ b/src/test/java/com/zaxxer/hikari/TestConnections.java @@ -16,6 +16,8 @@ package com.zaxxer.hikari; +import static com.zaxxer.hikari.util.UtilityElf.quietlySleep; + import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -31,11 +33,9 @@ import com.zaxxer.hikari.mocks.StubConnection; import com.zaxxer.hikari.mocks.StubDataSource; import com.zaxxer.hikari.mocks.StubStatement; import com.zaxxer.hikari.pool.HikariPool; -import com.zaxxer.hikari.pool.PoolInitializationException; +import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException; import com.zaxxer.hikari.util.UtilityElf; -import static com.zaxxer.hikari.util.UtilityElf.quietlySleep; - /** * System property testProxy can be one of: * "com.zaxxer.hikari.JavaProxyFactory" diff --git a/src/test/java/com/zaxxer/hikari/TestElf.java b/src/test/java/com/zaxxer/hikari/TestElf.java index b201818a..eae3140e 100644 --- a/src/test/java/com/zaxxer/hikari/TestElf.java +++ b/src/test/java/com/zaxxer/hikari/TestElf.java @@ -24,8 +24,8 @@ import java.util.HashMap; import org.slf4j.LoggerFactory; import org.slf4j.impl.SimpleLogger; +import com.zaxxer.hikari.pool.ProxyConnection; import com.zaxxer.hikari.pool.HikariPool; -import com.zaxxer.hikari.proxy.ConnectionProxy; /** * Utility methods for testing. @@ -66,7 +66,7 @@ public final class TestElf public static boolean getConnectionCommitDirtyState(Connection connection) { try { - Field field = ConnectionProxy.class.getDeclaredField("isCommitStateDirty"); + Field field = ProxyConnection.class.getDeclaredField("isCommitStateDirty"); field.setAccessible(true); return field.getBoolean(connection); }