From 34b13e764f863f3a6659403ad6eb1f70503acf8b Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 27 Aug 2012 21:47:00 +0800 Subject: [PATCH] add blob open count stat --- .../alibaba/druid/filter/stat/StatFilter.java | 55 +++++++++++++++++++ .../druid/filter/stat/StatFilterContext.java | 7 ++- .../stat/StatFilterContextListener.java | 2 +- .../StatFilterContextListenerAdapter.java | 5 +- .../com/alibaba/druid/stat/JdbcSqlStat.java | 23 +++++++- 5 files changed, 83 insertions(+), 9 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 b15ca04a7b..c9bb2dfbf1 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -708,6 +708,28 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { return blob; } + + @Override + public Blob resultSet_getBlob(FilterChain chain, ResultSetProxy result, int columnIndex) throws SQLException { + Blob blob = chain.resultSet_getBlob(result, columnIndex); + + if (blob != null) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, blob); + } + + return blob; + } + + @Override + public Blob resultSet_getBlob(FilterChain chain, ResultSetProxy result, String columnLabel) throws SQLException { + Blob blob = chain.resultSet_getBlob(result, columnLabel); + + if (blob != null) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, blob); + } + + return blob; + } @Override public Clob callableStatement_getClob(FilterChain chain, CallableStatementProxy statement, int parameterIndex) @@ -740,6 +762,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); } + + if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } return obj; } @@ -752,6 +778,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); } + + if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } return obj; } @@ -763,6 +793,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); } + + if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } return obj; } @@ -775,6 +809,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); } + + if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } return obj; } @@ -787,6 +825,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, (ClobProxy) obj); } + + if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), statement, (Blob) obj); + } return obj; } @@ -839,6 +881,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { return obj; } + + private void blobOpenAfter(JdbcDataSourceStat dataSourceStat, ResultSetProxy rs, Blob blob) { + blobOpenAfter(dataSourceStat, rs.getStatementProxy(), blob); + } private void clobOpenAfter(JdbcDataSourceStat dataSourceStat, ResultSetProxy rs, ClobProxy clob) { clobOpenAfter(dataSourceStat, rs.getStatementProxy(), clob); @@ -846,6 +892,15 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { private void blobOpenAfter(JdbcDataSourceStat dataSourceStat, StatementProxy stmt, Blob blob) { dataSourceStat.incrementBlobOpenCount(); + + if (stmt != null) { + JdbcSqlStat sqlStat = stmt.getSqlStat(); + if (sqlStat != null) { + sqlStat.incrementBlobOpenCount(); + } + } + + StatFilterContext.getInstance().blob_open(); } private void clobOpenAfter(JdbcDataSourceStat dataSourceStat, StatementProxy stmt, ClobProxy clob) { diff --git a/src/main/java/com/alibaba/druid/filter/stat/StatFilterContext.java b/src/main/java/com/alibaba/druid/filter/stat/StatFilterContext.java index ab3162abcc..97c84d5f89 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilterContext.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilterContext.java @@ -130,11 +130,12 @@ public class StatFilterContext { listener.clob_open(); } } - - public void clob_free() { + + public void blob_open() { for (int i = 0; i < listeners.size(); ++i) { StatFilterContextListener listener = listeners.get(i); - listener.clob_free(); + listener.blob_open(); } } + } diff --git a/src/main/java/com/alibaba/druid/filter/stat/StatFilterContextListener.java b/src/main/java/com/alibaba/druid/filter/stat/StatFilterContextListener.java index 218c24e229..2960431ca7 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilterContextListener.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilterContextListener.java @@ -43,5 +43,5 @@ public interface StatFilterContextListener { void clob_open(); - void clob_free(); + void blob_open(); } diff --git a/src/main/java/com/alibaba/druid/filter/stat/StatFilterContextListenerAdapter.java b/src/main/java/com/alibaba/druid/filter/stat/StatFilterContextListenerAdapter.java index 47dcea1061..839fddaab9 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilterContextListenerAdapter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilterContextListenerAdapter.java @@ -81,11 +81,12 @@ public class StatFilterContextListenerAdapter implements StatFilterContextListen public void clob_open() { } - + @Override - public void clob_free() { + public void blob_open() { } + } diff --git a/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java b/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java index 5dcdfaf0aa..01770643e5 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java @@ -76,6 +76,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { private boolean removed = false; private final AtomicLong clobOpenCount = new AtomicLong(); + private final AtomicLong blobOpenCount = new AtomicLong(); private final Histogram histogram = new Histogram(new long[] { // // @@ -223,6 +224,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { updateCountHistogram.reset(); executeAndResultHoldTimeHistogram.reset(); + blobOpenCount.set(0); clobOpenCount.set(0); } @@ -272,6 +274,14 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { public void incrementClobOpenCount() { clobOpenCount.incrementAndGet(); } + + public long getBlobOpenCount() { + return blobOpenCount.get(); + } + + public void incrementBlobOpenCount() { + blobOpenCount.incrementAndGet(); + } public long getId() { return id; @@ -394,7 +404,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { long current = executeSpanNanoMax.get(); if (current < nanoSpan) { if (executeSpanNanoMax.compareAndSet(current, nanoSpan)) { - // 可能不准确,但是绝大多数情况下都会正确,性能换取一致性 + // 可能不准确,但是绝大多数情况下都会正确,性能换取一致性 executeNanoSpanMaxOccurTime = System.currentTimeMillis(); break; @@ -489,13 +499,15 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { SimpleType.LONG, // new ArrayType(SimpleType.LONG, true), // - // 30 - - + // 30 - 34 new ArrayType(SimpleType.LONG, true), // new ArrayType(SimpleType.LONG, true), // SimpleType.LONG, // SimpleType.LONG, // SimpleType.LONG, // + + // 35 - + SimpleType.LONG, // }; @@ -548,6 +560,9 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { "EffectedRowCountMax", // "FetchRowCountMax", // "ClobOpenCount", + + // 35 - + "BlobOpenCount", // }; @@ -619,6 +634,8 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { map.put("EffectedRowCountMax", getUpdateCountMax()); // 32 map.put("FetchRowCountMax", getFetchRowCountMax()); // 33 map.put("ClobOpenCount", getClobOpenCount()); // 34 + + map.put("BlobOpenCount", getBlobOpenCount()); // 35 return map; }