From 59b9ae8612aa28dbfbf2ccc89c1f52b853f3789a Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 21 Jan 2017 22:28:59 +0800 Subject: [PATCH] DruidDataSource add keepAlive support. --- .../java/com/alibaba/druid/pool/DruidDataSource.java | 9 +++++---- .../druid/pool/DruidDataSourceStatLoggerImpl.java | 4 ++++ .../alibaba/druid/pool/DruidDataSourceStatValue.java | 10 ++++++++++ .../com/alibaba/druid/stat/JdbcDataSourceStat.java | 12 ++++++++++++ .../resources/support/http/resources/datasource.html | 7 ++++++- src/main/resources/support/http/resources/js/lang.js | 1 + .../java/com/alibaba/druid/bvt/pool/TestIdle.java | 2 +- 7 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index a41f226d4b..990d15c769 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -119,8 +119,6 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat private long notEmptyWaitNanos = 0L; private int keepAliveCheckCount = 0; - private final AtomicInteger keepAliveCheckOkCount = new AtomicInteger(); - private final AtomicInteger keepAliveCheckErrCount = new AtomicInteger(); private int activePeak = 0; private long activePeakTime = 0; @@ -1747,6 +1745,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat value.setWaitThreadCount(lock.getWaitQueueLength(notEmpty)); value.setNotEmptyWaitCount(this.notEmptyWaitCount); value.setNotEmptyWaitNanos(this.notEmptyWaitNanos); + value.setKeepAliveCheckCount(this.keepAliveCheckCount); // reset this.poolingPeak = 0; @@ -1755,6 +1754,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat this.activePeakTime = 0; this.connectCount = 0; this.closeCount = 0; + this.keepAliveCheckCount = 0; this.notEmptyWaitCount = 0; this.notEmptyWaitNanos = 0; @@ -2365,6 +2365,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } if (keepAliveCount > 0) { + this.getDataSourceStat().addKeepAliveCheckCount(keepAliveCount); for (int i = 0; i < keepAliveCount; ++i) { DruidConnectionHolder holer = keepAliveConnections[i]; Connection connection = holer.getConnection(); @@ -2383,9 +2384,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (validate) { holer.setLastActiveTimeMillis(System.currentTimeMillis()); put(holer); - keepAliveCheckOkCount.incrementAndGet(); } else { - keepAliveCheckErrCount.incrementAndGet(); JdbcUtils.close(connection); } } @@ -2699,6 +2698,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat map.put("CreateErrorCount", this.getCreateErrorCount()); map.put("DiscardCount", this.getDiscardCount()); + return map; } catch (JMException ex) { throw new IllegalStateException("getStatData error", ex); @@ -2797,6 +2797,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat dataMap.put("RemoveAbandoned", this.isRemoveAbandoned()); dataMap.put("ClobOpenCount", this.getDataSourceStat().getClobOpenCount()); dataMap.put("BlobOpenCount", this.getDataSourceStat().getBlobOpenCount()); + dataMap.put("KeepAliveCheckCount", this.getDataSourceStat().getKeepAliveCheckCount()); return dataMap; } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatLoggerImpl.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatLoggerImpl.java index 6a6de76a0a..9017f7e732 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatLoggerImpl.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatLoggerImpl.java @@ -234,6 +234,10 @@ public class DruidDataSourceStatLoggerImpl extends DruidDataSourceStatLoggerAdap map.put("sqlList", sqlList); } + if (statValue.getKeepAliveCheckCount() > 0) { + map.put("keepAliveCheckCount", statValue.getKeepAliveCheckCount()); + } + String text = JSONUtils.toJSONString(map); log(text); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatValue.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatValue.java index c2855b6728..d47d6e2219 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatValue.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceStatValue.java @@ -117,6 +117,9 @@ public class DruidDataSourceStatValue { @MField(aggregate = AggregateType.Sum) protected long startTransactionCount; + @MField(aggregate = AggregateType.Sum) + protected long keepAliveCheckCount; + // protected long[] transactionHistogram; protected long[] connectionHoldTimeHistogram; @@ -563,4 +566,11 @@ public class DruidDataSourceStatValue { this.poolingPeakTime = poolingPeakTime; } + public long getKeepAliveCheckCount() { + return keepAliveCheckCount; + } + + public void setKeepAliveCheckCount(long keepAliveCheckCount) { + this.keepAliveCheckCount = keepAliveCheckCount; + } } diff --git a/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java b/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java index c276404700..714f75ce5b 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java @@ -73,6 +73,7 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { private final AtomicLong clobOpenCount = new AtomicLong(); private final AtomicLong blobOpenCount = new AtomicLong(); + private final AtomicLong keepAliveCheckCount = new AtomicLong(); private boolean resetStatEnable = true; @@ -497,4 +498,15 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { blobOpenCount.incrementAndGet(); } + public long getKeepAliveCheckCount() { + return keepAliveCheckCount.get(); + } + + public long getKeepAliveCheckCountAndReset() { + return keepAliveCheckCount.getAndSet(0); + } + + public void addKeepAliveCheckCount(long delta) { + keepAliveCheckCount.addAndGet(delta); + } } diff --git a/src/main/resources/support/http/resources/datasource.html b/src/main/resources/support/http/resources/datasource.html index ad49bf746b..320d4dc6dc 100644 --- a/src/main/resources/support/http/resources/datasource.html +++ b/src/main/resources/support/http/resources/datasource.html @@ -268,13 +268,18 @@ {{=datasourceNow.BlobOpenCount}} + + KeepAliveCheckCount + {{=datasourceNow.KeepAliveCheckCount}} + + ActiveConnection StackTrace View - StackTrace for active Connection. + StackTrace for active Connection. [View JSON API] diff --git a/src/main/resources/support/http/resources/js/lang.js b/src/main/resources/support/http/resources/js/lang.js index 9954feb4e4..16bae8f87a 100644 --- a/src/main/resources/support/http/resources/js/lang.js +++ b/src/main/resources/support/http/resources/js/lang.js @@ -73,6 +73,7 @@ druid.lang = function() { 'ConnectionHoldTimeHistogram' : ['ConnectionHoldTimeHistogram', '连接持有时间分布'], 'ClobOpenCount' : ['ClobOpenCount', 'Clob打开次数'], 'BlobOpenCount' : ['BlobOpenCount', 'Blob打开次数'], + 'KeepAliveCheckCount' : ['KeepAliveCheckCount', 'KeepAlive检测次数'], 'ActiveConnectionStackTrace' : ['ActiveConnection StackTrace', '活跃连接堆栈查看'], 'PollingConnectionInfo' : ['PollingConnection Info', '连接池中连接信息'], 'SQLList' : ['SQL List', 'sql列表'], diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java b/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java index 87568e2631..520386d5d6 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestIdle.java @@ -107,7 +107,7 @@ public class TestIdle extends TestCase { Thread.sleep(dataSource.getMinEvictableIdleTimeMillis() * 2); Assert.assertEquals(0, driver.getConnections().size()); - Assert.assertEquals(0, dataSource.getPoolingCount()); + Assert.assertEquals(1, dataSource.getPoolingCount()); { Connection conn = dataSource.getConnection(); Assert.assertEquals(1, dataSource.getActiveCount());