From 6c664407dd648f97ddc5c7593778c61992ff848f Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 16 May 2014 16:07:46 +0900 Subject: [PATCH 1/6] Use some static imports. --- .../com/zaxxer/hikari/pool/HikariPool.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 260ca960..120d4159 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -45,6 +45,11 @@ import com.zaxxer.hikari.util.DriverDataSource; import com.zaxxer.hikari.util.PoolUtilities; import com.zaxxer.hikari.util.PropertyBeanSetter; +import static com.zaxxer.hikari.util.PoolUtilities.elapsedTimeMs; +import static com.zaxxer.hikari.util.PoolUtilities.createInstance; +import static com.zaxxer.hikari.util.PoolUtilities.createThreadPoolExecutor; +import static com.zaxxer.hikari.util.PoolUtilities.IS_JAVA7; + /** * This is the primary connection pool class that provides the basic * pooling behavior for HikariCP. @@ -127,7 +132,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener HikariMBeanElf.registerMBeans(configuration, this); } - addConnectionExecutor = PoolUtilities.createThreadPoolExecutor(configuration.getMaximumPoolSize(), "HikariCP connection filler"); + addConnectionExecutor = createThreadPoolExecutor(configuration.getMaximumPoolSize(), "HikariCP connection filler"); fillPool(); @@ -167,7 +172,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener if (now > connection.getExpirationTime() || (now - connection.getLastAccess() > 1000 && !isConnectionAlive(connection, timeout))) { closeConnection(connection); // Throw away the dead connection, try again - timeout -= PoolUtilities.elapsedTimeMs(start); + timeout -= elapsedTimeMs(start); continue; } else if (leakDetectionThreshold != 0) @@ -203,7 +208,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { if (isRecordMetrics) { - metricsTracker.recordConnectionUsage(PoolUtilities.elapsedTimeMs(connectionProxy.getLastOpenTime())); + metricsTracker.recordConnectionUsage(elapsedTimeMs(connectionProxy.getLastOpenTime())); } if (isBroken || isShutdown) @@ -234,7 +239,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener closeIdleConnections(); abortActiveConnections(); } - while ((getIdleConnections() > 0 || getActiveConnections() > 0 ) && PoolUtilities.elapsedTimeMs(start) < TimeUnit.SECONDS.toMillis(5)); + while ((getIdleConnections() > 0 || getActiveConnections() > 0 ) && elapsedTimeMs(start) < TimeUnit.SECONDS.toMillis(5)); logPoolState("State after shutdown "); @@ -483,12 +488,12 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener */ private void abortActiveConnections() throws InterruptedException { - ThreadPoolExecutor assassinExecutor = PoolUtilities.createThreadPoolExecutor(1, "HikariCP connection assassin"); + ThreadPoolExecutor assassinExecutor = createThreadPoolExecutor(1, "HikariCP connection assassin"); for (IHikariConnectionProxy connectionProxy : connectionBag.values(ConcurrentBag.STATE_IN_USE)) { try { - if (PoolUtilities.IS_JAVA7) + if (IS_JAVA7) { connectionProxy.abort(assassinExecutor); } @@ -531,7 +536,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { try { - DataSource dataSource = PoolUtilities.createInstance(dsClassName, DataSource.class); + DataSource dataSource = createInstance(dsClassName, DataSource.class); PropertyBeanSetter.setTargetFromProperties(dataSource, configuration.getDataSourceProperties()); return dataSource; } @@ -554,7 +559,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { try { - return PoolUtilities.createInstance(configuration.getConnectionCustomizerClassName(), IConnectionCustomizer.class); + return createInstance(configuration.getConnectionCustomizerClassName(), IConnectionCustomizer.class); } catch (Exception e) { From b2b07885d8e9fb386654d07129d847e89c78b26b Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Fri, 16 May 2014 09:49:08 +0200 Subject: [PATCH 2/6] Make leakTrace local as there is no need to make it an attribute. --- src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java index 445328f7..b0e594ee 100644 --- a/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java +++ b/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java @@ -64,7 +64,6 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy private volatile long lastAccess; private long uncloseTime; - private StackTraceElement[] leakTrace; private TimerTask leakTask; private final int hashCode; @@ -126,7 +125,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy public final void captureStack(long leakDetectionThreshold, Timer scheduler) { StackTraceElement[] trace = Thread.currentThread().getStackTrace(); - leakTrace = new StackTraceElement[trace.length - 4]; + StackTraceElement[] leakTrace = new StackTraceElement[trace.length - 4]; System.arraycopy(trace, 4, leakTrace, 0, leakTrace.length); leakTask = new LeakTask(leakTrace, leakDetectionThreshold); From 34d5f74e0f6ebcfba39c9cf605b8ff3eaaf6fdc7 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Fri, 16 May 2014 09:52:47 +0200 Subject: [PATCH 3/6] Use entrySet() instead of keySet(). --- .../java/com/zaxxer/hikari/util/PropertyBeanSetter.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java b/src/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java index 845f6bf9..9823261f 100644 --- a/src/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java +++ b/src/main/java/com/zaxxer/hikari/util/PropertyBeanSetter.java @@ -22,6 +22,7 @@ import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.util.HashSet; +import java.util.Map.Entry; import java.util.Properties; import java.util.Set; @@ -46,10 +47,10 @@ public final class PropertyBeanSetter return; } - for (Object propKey : properties.keySet()) + for (Entry propEntry : properties.entrySet()) { - String propName = propKey.toString(); - Object propValue = properties.get(propKey); + String propName = propEntry.getKey().toString(); + Object propValue = propEntry.getValue(); if (target instanceof HikariConfig && propName.startsWith("dataSource.")) { From 4e26f3e2020bfe5fd3271952021be040192d81c6 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Fri, 16 May 2014 09:55:37 +0200 Subject: [PATCH 4/6] Fix typo: s/&/&&/. --- src/main/java/com/zaxxer/hikari/HikariDataSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/zaxxer/hikari/HikariDataSource.java b/src/main/java/com/zaxxer/hikari/HikariDataSource.java index 6bbe7c33..6e8b8633 100644 --- a/src/main/java/com/zaxxer/hikari/HikariDataSource.java +++ b/src/main/java/com/zaxxer/hikari/HikariDataSource.java @@ -190,7 +190,7 @@ public class HikariDataSource extends HikariConfig implements DataSource @Override public boolean isWrapperFor(Class iface) throws SQLException { - return (pool != null & pool.getDataSource().getClass().isAssignableFrom(iface)); + return (pool != null && pool.getDataSource().getClass().isAssignableFrom(iface)); } /** From bebe95b504bd5b866d9320f63efbddb602defb0e Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Fri, 16 May 2014 23:54:42 +0900 Subject: [PATCH 5/6] More clean-up/tighten-up of code. --- .../com/zaxxer/hikari/pool/HikariPool.java | 79 +++++++++++-------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java index 120d4159..246206ea 100644 --- a/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -42,12 +42,14 @@ import com.zaxxer.hikari.proxy.ProxyFactory; import com.zaxxer.hikari.util.ConcurrentBag; import com.zaxxer.hikari.util.ConcurrentBag.IBagStateListener; import com.zaxxer.hikari.util.DriverDataSource; -import com.zaxxer.hikari.util.PoolUtilities; import com.zaxxer.hikari.util.PropertyBeanSetter; import static com.zaxxer.hikari.util.PoolUtilities.elapsedTimeMs; import static com.zaxxer.hikari.util.PoolUtilities.createInstance; import static com.zaxxer.hikari.util.PoolUtilities.createThreadPoolExecutor; +import static com.zaxxer.hikari.util.PoolUtilities.executeSqlAutoCommit; +import static com.zaxxer.hikari.util.PoolUtilities.quietlySleep; +import static com.zaxxer.hikari.util.PoolUtilities.quietlyCloseConnection; import static com.zaxxer.hikari.util.PoolUtilities.IS_JAVA7; /** @@ -154,16 +156,16 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { final long start = System.currentTimeMillis(); final Context context = (isRecordMetrics ? metricsTracker.recordConnectionRequest(start) : MetricsTracker.NO_CONTEXT); - long timeout = configuration.getConnectionTimeout(); + try { do { IHikariConnectionProxy connection = connectionBag.borrow(timeout, TimeUnit.MILLISECONDS); - if (connection == null) // We timed out... break and throw exception + if (connection == null) { - break; + break; // We timed out... break and throw exception } final long now = System.currentTimeMillis(); @@ -171,7 +173,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener if (now > connection.getExpirationTime() || (now - connection.getLastAccess() > 1000 && !isConnectionAlive(connection, timeout))) { - closeConnection(connection); // Throw away the dead connection, try again + closeConnection(connection); // Throw away the dead connection and try again timeout -= elapsedTimeMs(start); continue; } @@ -183,19 +185,19 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener return connection; } while (timeout > 0); - - logPoolState("Timeout failure "); - throw new SQLException(String.format("Timeout of %dms encountered waiting for connection.", - configuration.getConnectionTimeout()), lastConnectionFailure.getAndSet(null)); } catch (InterruptedException e) { - return null; + throw new SQLException("Interrupted during connection acquisition", e); } finally { context.stop(); } + + logPoolState("Timeout failure "); + throw new SQLException(String.format("Timeout of %dms encountered waiting for connection.", + configuration.getConnectionTimeout()), lastConnectionFailure.getAndSet(null)); } /** @@ -215,21 +217,26 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { LOGGER.debug("Connection returned to pool {} is broken, or the pool is shutting down. Closing connection.", configuration.getPoolName()); closeConnection(connectionProxy); + return; } - else - { - connectionBag.requite(connectionProxy); - } + + connectionBag.requite(connectionProxy); } + /** + * Shutdown the pool, closing all idle connections and aborting or closing + * active connections. + * + * @throws InterruptedException thrown if the thread is interrupted during shutdown + */ public void shutdown() throws InterruptedException { if (!isShutdown) { isShutdown = true; LOGGER.info("HikariCP pool {} is shutting down.", configuration.getPoolName()); - logPoolState("State at shutdown "); + logPoolState("Before shutdown "); houseKeepingTimer.cancel(); addConnectionExecutor.shutdownNow(); @@ -241,7 +248,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener } while ((getIdleConnections() > 0 || getActiveConnections() > 0 ) && elapsedTimeMs(start) < TimeUnit.SECONDS.toMillis(5)); - logPoolState("State after shutdown "); + logPoolState("After shutdown "); if (isRegisteredMbeans) { @@ -250,13 +257,18 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener } } + /** + * Get the wrapped DataSource. + * + * @return the wrapped DataSource + */ public DataSource getDataSource() { return dataSource; } /** - * Permanently close a connection. + * Permanently close the real (underlying) connection (eat any exception). * * @param connectionProxy the connection to actually close */ @@ -288,7 +300,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener } // *********************************************************************** - // IBagStateListener methods + // IBagStateListener callback // *********************************************************************** /** {@inheritDoc} */ @@ -298,21 +310,21 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener class AddConnection implements Runnable { public void run() { - int sleepBackoff = 200; + long sleepBackoff = 200; final int maxPoolSize = configuration.getMaximumPoolSize(); final int minIdle = configuration.getMinimumIdle(); while (!isShutdown && totalConnections.get() < maxPoolSize && (minIdle == 0 || getIdleConnections() < minIdle)) { if (!addConnection()) { - PoolUtilities.quietlySleep(sleepBackoff); - sleepBackoff = (int) Math.min(1000f, ((float) sleepBackoff) * 1.5); + quietlySleep(sleepBackoff); + sleepBackoff = (long) Math.min(1000f, ((float) sleepBackoff) * 1.5); continue; } - if (minIdle == 0) // This break is here so we only add one connection when demanded + if (minIdle == 0) { - break; + break; // This break is here so we only add one connection when there is no min. idle } } } @@ -390,7 +402,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener transactionIsolation = (transactionIsolation < 0 ? connection.getTransactionIsolation() : transactionIsolation); connectionCustomizer.customize(connection); - PoolUtilities.executeSqlAutoCommit(connection, configuration.getConnectionInitSql()); + executeSqlAutoCommit(connection, configuration.getConnectionInitSql()); IHikariConnectionProxy proxyConnection = ProxyFactory.getProxyConnection(this, connection, configuration.getMaxLifetime(), transactionIsolation, isAutoCommit, isReadOnly, catalog); @@ -405,9 +417,8 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener totalConnections.decrementAndGet(); lastConnectionFailure.set(e); - PoolUtilities.quietlyCloseConnection(connection); + quietlyCloseConnection(connection); LOGGER.debug("Connection attempt to database {} failed: {}", configuration.getPoolName(), e.getMessage(), e); - return false; } } @@ -496,11 +507,10 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener if (IS_JAVA7) { connectionProxy.abort(assassinExecutor); + continue; } - else - { - connectionProxy.close(); - } + + connectionProxy.close(); } catch (SQLException e) { @@ -574,7 +584,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener { int total = totalConnections.get(); int idle = getIdleConnections(); - LOGGER.debug("{}Pool stats {} (total={}, inUse={}, avail={}, waiting={})", (prefix.length > 0 ? prefix[0] : ""), + LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})", (prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(), total, total - idle, idle, getThreadsAwaitingConnection()); } @@ -586,10 +596,9 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener @Override public void run() { + logPoolState("Before cleanup "); houseKeepingTimer.purge(); - logPoolState("Before pool cleanup "); - final long now = System.currentTimeMillis(); final long idleTimeout = configuration.getIdleTimeout(); @@ -609,11 +618,11 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener } } - logPoolState("After pool cleanup "); + logPoolState("After cleanup "); if (getIdleConnections() < configuration.getMinimumIdle() && totalConnections.get() < configuration.getMaximumPoolSize()) { - addBagItem(); // TRY to maintain minimum connections + addBagItem(); // Try to maintain minimum connections } } } From 275aeeb19c97ed46c053a46eef1ddd2d6989ae2d Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 17 May 2014 14:31:53 +0900 Subject: [PATCH 6/6] 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; }