From 275aeeb19c97ed46c053a46eef1ddd2d6989ae2d Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 17 May 2014 14:31:53 +0900 Subject: [PATCH] More clean-up/tighten-up of code. --- .../com/zaxxer/hikari/HikariDataSource.java | 54 ++++++++----------- .../com/zaxxer/hikari/pool/HikariPool.java | 32 +++++------ .../com/zaxxer/hikari/util/ConcurrentBag.java | 8 +-- .../java/com/zaxxer/hikari/util/FastList.java | 6 +-- .../com/zaxxer/hikari/util/PoolUtilities.java | 10 ++-- 5 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/HikariDataSource.java b/src/main/java/com/zaxxer/hikari/HikariDataSource.java index 6e8b8633..e55a8524 100644 --- a/src/main/java/com/zaxxer/hikari/HikariDataSource.java +++ b/src/main/java/com/zaxxer/hikari/HikariDataSource.java @@ -40,7 +40,9 @@ public class HikariDataSource extends HikariConfig implements DataSource { private static final Logger LOGGER = LoggerFactory.getLogger(HikariDataSource.class); + // We use a concrete HashMap rather than Map to avoid an invokeinterface callsite private final HashMap multiPool; + private volatile boolean isShutdown; private int loginTimeout; @@ -228,41 +230,14 @@ public class HikariDataSource extends HikariConfig implements DataSource isShutdown = true; - if (pool != null) + if (fastPathPool != null) { - try - { - pool.shutdown(); - } - catch (InterruptedException e) - { - LoggerFactory.getLogger(getClass()).warn("Interrupted during shutdown", e); - } - - if (pool.getDataSource() instanceof DriverDataSource) - { - ((DriverDataSource) pool.getDataSource()).shutdown(); - } + shutdownHelper(fastPathPool); } - if (!multiPool.isEmpty()) + for (HikariPool hikariPool : multiPool.values()) { - for (HikariPool hikariPool : multiPool.values()) - { - try - { - hikariPool.shutdown(); - } - catch (InterruptedException e) - { - LoggerFactory.getLogger(getClass()).warn("Interrupted during shutdown", e); - } - - if (hikariPool.getDataSource() instanceof DriverDataSource) - { - ((DriverDataSource) hikariPool.getDataSource()).shutdown(); - } - } + shutdownHelper(hikariPool); } } @@ -273,6 +248,23 @@ public class HikariDataSource extends HikariConfig implements DataSource return String.format("HikariDataSource (%s)", pool); } + private void shutdownHelper(HikariPool hPool) + { + try + { + hPool.shutdown(); + } + catch (InterruptedException e) + { + LoggerFactory.getLogger(getClass()).warn("Interrupted during shutdown", e); + } + + if (hPool.getDataSource() instanceof DriverDataSource) + { + ((DriverDataSource) hPool.getDataSource()).shutdown(); + } + } + private static class MultiPoolKey { private String username; diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 246206ea..b83f6fff 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -440,29 +440,26 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { return connection.isValid((int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs)); } - else + + Statement statement = connection.createStatement(); + try { - Statement statement = connection.createStatement(); - try - { - if (configuration.getConnectionTimeout() < Integer.MAX_VALUE) - { - statement.setQueryTimeout((int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs)); - } - statement.executeQuery(configuration.getConnectionTestQuery()); - } - finally + if (configuration.getConnectionTimeout() < Integer.MAX_VALUE) { - statement.close(); + statement.setQueryTimeout((int) TimeUnit.MILLISECONDS.toSeconds(timeoutMs)); } - + statement.executeQuery(configuration.getConnectionTestQuery()); + } + finally + { + statement.close(); if (isIsolateInternalQueries && !isAutoCommit) { connection.rollback(); } - - return true; } + + return true; } catch (SQLException e) { @@ -620,10 +617,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener logPoolState("After cleanup "); - if (getIdleConnections() < configuration.getMinimumIdle() && totalConnections.get() < configuration.getMaximumPoolSize()) - { - addBagItem(); // Try to maintain minimum connections - } + addBagItem(); // Try to maintain minimum connections } } } diff --git a/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java index 165e2845..907ee306 100644 --- a/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java +++ b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java @@ -322,18 +322,20 @@ public class ConcurrentBag[0]) != null; + b = AbstractQueuedLongSynchronizer.class.getMethod("hasQueuedPredecessors", new Class[0]) != null; } catch (Exception e) { - // nothing } + + JAVA7 = b; } @Override diff --git a/src/main/java/com/zaxxer/hikari/util/FastList.java b/src/main/java/com/zaxxer/hikari/util/FastList.java index b230d29a..ccb8cdde 100644 --- a/src/main/java/com/zaxxer/hikari/util/FastList.java +++ b/src/main/java/com/zaxxer/hikari/util/FastList.java @@ -27,7 +27,6 @@ import java.lang.reflect.Array; public final class FastList { private T[] elementData; - private int size; /** @@ -60,8 +59,7 @@ public final class FastList { try { - elementData[size] = element; - size++; + elementData[size++] = element; } catch (ArrayIndexOutOfBoundsException e) { @@ -71,7 +69,7 @@ public final class FastList @SuppressWarnings("unchecked") final T[] newElementData = (T[]) Array.newInstance(element.getClass(), newCapacity); System.arraycopy(elementData, 0, newElementData, 0, oldCapacity); - newElementData[size++] = element; + newElementData[size - 1] = element; elementData = newElementData; } } diff --git a/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java b/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java index 2ed84e28..41ef42ee 100644 --- a/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java +++ b/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java @@ -11,18 +11,20 @@ import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; public final class PoolUtilities { - public static boolean IS_JAVA7; + public static final boolean IS_JAVA7; static { + boolean b = false; try { - IS_JAVA7 = AbstractQueuedLongSynchronizer.class.getMethod("hasQueuedPredecessors", new Class[0]) != null; + b = AbstractQueuedLongSynchronizer.class.getMethod("hasQueuedPredecessors", new Class[0]) != null; } catch (Exception e) { - IS_JAVA7 = false; } + + IS_JAVA7 = b; } public static void quietlyCloseConnection(Connection connection) @@ -119,7 +121,7 @@ public final class PoolUtilities int processors = Math.max(1, Runtime.getRuntime().availableProcessors() / 2); LinkedBlockingQueue queue = new LinkedBlockingQueue(queueSize); - ThreadPoolExecutor executor = new ThreadPoolExecutor(processors, processors, 10, TimeUnit.SECONDS, queue, threadFactory, new ThreadPoolExecutor.DiscardPolicy()); + ThreadPoolExecutor executor = new ThreadPoolExecutor(processors, processors, 2, TimeUnit.SECONDS, queue, threadFactory, new ThreadPoolExecutor.DiscardPolicy()); executor.allowCoreThreadTimeOut(true); return executor; }