From a54e50a0aee18eddff533ab3a8e5d802ef197ef5 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sun, 13 Jul 2014 21:48:37 +0900 Subject: [PATCH] Add an MBean function to dump the current state of the pool (via a dump of the ConcurrentBag) --- .../com/zaxxer/hikari/pool/HikariPool.java | 7 +++++ .../zaxxer/hikari/pool/HikariPoolMBean.java | 2 ++ .../zaxxer/hikari/proxy/ConnectionProxy.java | 6 +++++ .../com/zaxxer/hikari/util/ConcurrentBag.java | 25 ++++++++++++++++++ .../com/zaxxer/hikari/pool/HikariPool.java | 7 +++++ .../zaxxer/hikari/pool/HikariPoolMBean.java | 2 ++ .../zaxxer/hikari/proxy/ConnectionProxy.java | 6 +++++ .../com/zaxxer/hikari/util/ConcurrentBag.java | 26 +++++++++++++++++++ 8 files changed, 81 insertions(+) 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 index f7b02510..ebb0747c 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPool.java @@ -366,6 +366,13 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener } } + /** {@inheritDoc} */ + @Override + public void dumpPoolState() + { + connectionBag.dumpState(); + } + // *********************************************************************** // Private methods // *********************************************************************** diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java index e03fae05..2c045e73 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/pool/HikariPoolMBean.java @@ -32,4 +32,6 @@ public interface HikariPoolMBean int getThreadsAwaitingConnection(); void closeIdleConnections(); + + void dumpPoolState(); } diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java index 0a0dca56..079be275 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java @@ -139,6 +139,12 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy return hashCode; } + @Override + public String toString() + { + return String.format("%s(%s) wrapping %s", this.getClass().getSimpleName(), System.identityHashCode(this), delegate); + } + // *********************************************************************** // IHikariConnectionProxy methods // *********************************************************************** diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java index 539027b7..caea9842 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java @@ -24,6 +24,9 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * This is a specialized concurrent bag that achieves superior performance * to LinkedBlockingQueue and LinkedTransferQueue for the purposes of a @@ -46,6 +49,8 @@ import java.util.concurrent.locks.AbstractQueuedLongSynchronizer; */ public class ConcurrentBag { + private static final Logger LOGGER = LoggerFactory.getLogger(ConcurrentBag.class); + public static final int STATE_NOT_IN_USE = 0; public static final int STATE_IN_USE = 1; private static final int STATE_REMOVED = -1; @@ -299,6 +304,26 @@ public class ConcurrentBag { + private static final Logger LOGGER = LoggerFactory.getLogger(ConcurrentBag.class); + public static final int STATE_NOT_IN_USE = 0; public static final int STATE_IN_USE = 1; private static final int STATE_REMOVED = -1; @@ -290,6 +296,26 @@ public class ConcurrentBag { + switch (reference.getState()) { + case STATE_IN_USE: + LOGGER.info(reference.toString() + " state IN_USE"); + break; + case STATE_NOT_IN_USE: + LOGGER.info(reference.toString() + " state NOT_IN_USE"); + break; + case STATE_REMOVED: + LOGGER.info(reference.toString() + " state REMOVED"); + break; + case STATE_RESERVED: + LOGGER.info(reference.toString() + " state RESERVED"); + break; + } + }); + } + /** * Our private synchronizer that handles notify/wait type semantics. */