From 2db857b5fef307e7df819e39d7bd2063b208a9cb Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 27 Aug 2012 21:38:07 +0800 Subject: [PATCH] add blob open count stat --- .../alibaba/druid/filter/stat/StatFilter.java | 42 ++++++++++++++++++- .../alibaba/druid/pool/DruidDataSource.java | 3 +- .../druid/stat/JdbcDataSourceStat.java | 11 +++++ .../support/http/resources/datasource.html | 8 +++- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java index 3562700a5c..b15ca04a7b 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -507,7 +507,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (index != 0) { out.writeComma(); } - + Object value = parameter.getValue(); if (value == null) { out.writeNull(); @@ -685,6 +685,30 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { return clob; } + @Override + public Blob callableStatement_getBlob(FilterChain chain, CallableStatementProxy statement, int parameterIndex) + throws SQLException { + Blob blob = chain.callableStatement_getBlob(statement, parameterIndex); + + if (blob != null) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, blob); + } + + return blob; + } + + @Override + public Blob callableStatement_getBlob(FilterChain chain, CallableStatementProxy statement, String parameterName) + throws SQLException { + Blob blob = chain.callableStatement_getBlob(statement, parameterName); + + if (blob != null) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, blob); + } + + return blob; + } + @Override public Clob callableStatement_getClob(FilterChain chain, CallableStatementProxy statement, int parameterIndex) throws SQLException { @@ -776,6 +800,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { clobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, (ClobProxy) obj); } + if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, (Blob) obj); + } + return obj; } @@ -788,6 +816,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { clobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, (ClobProxy) obj); } + if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, (Blob) obj); + } + return obj; } @@ -801,6 +833,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { clobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, (ClobProxy) obj); } + if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, (Blob) obj); + } + return obj; } @@ -808,6 +844,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { clobOpenAfter(dataSourceStat, rs.getStatementProxy(), clob); } + private void blobOpenAfter(JdbcDataSourceStat dataSourceStat, StatementProxy stmt, Blob blob) { + dataSourceStat.incrementBlobOpenCount(); + } + private void clobOpenAfter(JdbcDataSourceStat dataSourceStat, StatementProxy stmt, ClobProxy clob) { dataSourceStat.incrementClobOpenCount(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index ab3eccbbbb..8189456805 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -815,7 +815,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat discardConnection(holder.getConnection()); return; } - + final long lastActiveTimeMillis = System.currentTimeMillis(); lock.lockInterruptibly(); try { @@ -1774,6 +1774,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat dataMap.put("ConnectionHoldTimeHistogram", this.getDataSourceStat().getConnectionHoldHistogram().toArray()); dataMap.put("RemoveAbandoned", this.isRemoveAbandoned()); dataMap.put("ClobOpenCount", this.getDataSourceStat().getClobOpenCount()); + dataMap.put("BlobOpenCount", this.getDataSourceStat().getBlobOpenCount()); return dataMap; } diff --git a/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java b/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java index a61281c526..3c95692c58 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java @@ -68,6 +68,8 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { private final AtomicLong clobOpenCount = new AtomicLong(); + private final AtomicLong blobOpenCount = new AtomicLong(); + public JdbcDataSourceStat(String name, String url){ this(name, url, null); } @@ -101,6 +103,7 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { } public void reset() { + blobOpenCount.set(0); clobOpenCount.set(0); connectionStat.reset(); @@ -318,4 +321,12 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { clobOpenCount.incrementAndGet(); } + public long getBlobOpenCount() { + return blobOpenCount.get(); + } + + public void incrementBlobOpenCount() { + blobOpenCount.incrementAndGet(); + } + } diff --git a/src/main/resources/support/http/resources/datasource.html b/src/main/resources/support/http/resources/datasource.html index eaa499d7bb..7170193d88 100644 --- a/src/main/resources/support/http/resources/datasource.html +++ b/src/main/resources/support/http/resources/datasource.html @@ -30,7 +30,9 @@ "NotEmptyWaitMillis", "WaitThreadCount", "StartTransactionCount", "TransactionHistogram", "PoolingCount", "PoolingPeak", "PoolingPeakTime", "ActiveCount", "ActivePeak", "ActivePeakTime", "LogicConnectCount", "LogicCloseCount", "LogicConnectErrorCount", "PhysicalConnectCount", "PhysicalCloseCount", "PhysicalConnectErrorCount", "ExecuteCount", "ErrorCount", "CommitCount", - "RollbackCount", "PSCacheAccessCount", "PSCacheHitCount", "PSCacheMissCount", "ConnectionHoldTimeHistogram"] + "RollbackCount", "PSCacheAccessCount", "PSCacheHitCount", "PSCacheMissCount", "ConnectionHoldTimeHistogram", + "ClobOpenCount", "BlobOpenCount" + ] var descs = ["Specify the username used when creating a new connection.", "The JDBC driver connection URL", "database type", "The fully qualifed name of the JDBC driver class", "All the fully qualifed name of the filter classes", " Test or not when borrow a connection", "Test or not when return a connection", @@ -42,7 +44,9 @@ "The usefull connection peak time", "The current active connection count", "The current active connection peak count", "The active connection peak time", "Total connect times from datasource", "Total close connect times from datasource", "Total connect error times", "Create physical connnection count", "Close physical connnection count", "Total physical connect error times", "", "", "", - "", "PerpareStatement access count", "PerpareStatement hit count", "PerpareStatement miss count", "The histogram values of connection hold time, [0-1 ms, 1-10 ms, 10-100 ms, 100ms-1s, 1-10 s, 10-100 s, 100-1000 s, >1000 s]"] + "", "PerpareStatement access count", "PerpareStatement hit count", "PerpareStatement miss count", "The histogram values of connection hold time, [0-1 ms, 1-10 ms, 10-100 ms, 100ms-1s, 1-10 s, 10-100 s, 100-1000 s, >1000 s]", + "", "" + ] return { init : function() { druid.common.buildHead(1);