diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java index 9791cfd895..58edcee2f1 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java @@ -79,4 +79,6 @@ public interface DruidAbstractDataSourceMBean { long getTimeBetweenConnectErrorMillis(); int getMaxOpenPreparedStatements(); + + long getRemoveAbandonedCount(); } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 918bb0ebd6..c2dbedfb53 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -74,6 +74,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat private long recycleCount = 0L; private long createConnectionCount = 0L; private long destroyCount = 0L; + private long removeAbandonedCount = 0L; // store private ConnectionHolder[] connections; @@ -100,6 +101,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat recycleCount = 0; createConnectionCount = 0; destroyCount = 0; + removeAbandonedCount = 0; } finally { lock.unlock(); } @@ -644,6 +646,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat return activeCount; } + public long getRemoveAbandonedCount() { + return removeAbandonedCount; + } + public class CreateConnectionThread extends Thread { public CreateConnectionThread(String name){ @@ -702,7 +708,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (breakAfterAcquireFailure) { break; } - + try { Thread.sleep(timeBetweenConnectErrorMillis); } catch (InterruptedException interruptEx) { @@ -774,6 +780,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (timeMillis >= removeAbandonedTimeoutMillis) { PoolableConnection pooledConnection = entry.getKey(); JdbcUtils.close(pooledConnection); + removeAbandonedCount++; if (isLogAbandoned()) { StringBuilder buf = new StringBuilder(); diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index 68199a4c16..bda3b40217 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -95,6 +95,7 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe map.put("ValidationQueryTimeout", dataSource.getValidationQueryTimeout()); map.put("DriverClassName", dataSource.getDriverClassName()); map.put("Username", dataSource.getUsername()); + map.put("RemoveAbandonedCount", dataSource.getRemoveAbandonedCount()); return new CompositeDataSupport(rowType, map); } @@ -113,7 +114,7 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe SimpleType.LONG, SimpleType.INTEGER, SimpleType.INTEGER, SimpleType.INTEGER, SimpleType.INTEGER, // SimpleType.INTEGER, SimpleType.INTEGER, SimpleType.INTEGER, SimpleType.BOOLEAN, SimpleType.BOOLEAN, // SimpleType.BOOLEAN, SimpleType.LONG, SimpleType.LONG, SimpleType.LONG, SimpleType.STRING, // - SimpleType.STRING, SimpleType.INTEGER, SimpleType.STRING, SimpleType.STRING, + SimpleType.STRING, SimpleType.INTEGER, SimpleType.STRING, SimpleType.STRING, SimpleType.LONG, // }; @@ -123,7 +124,7 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe "CloseCount", "ActiveCount", "PoolingCount", "LockQueueLength", "WaitThreadCount", // "InitialSize", "MaxActive", "MinIdle", "PoolPreparedStatements", "TestOnBorrow", // "TestOnReturn", "MinEvictableIdleTimeMillis", "ConnectErrorCount", "CreateTimespanMillis", "DbType", // - "ValidationQuery", "ValidationQueryTimeout", "DriverClassName", "Username" + "ValidationQuery", "ValidationQueryTimeout", "DriverClassName", "Username", "RemoveAbandonedCount" // };