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 c9bb2dfbf1..3698e0760e 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -573,6 +573,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { sqlStat.addFetchRowCount(fetchRowCount); long stmtExecuteNano = resultSet.getStatementProxy().getLastExecuteTimeNano(); sqlStat.addResultSetHoldTimeNano(stmtExecuteNano, nanos); + sqlStat.addStringReadLength(resultSet.getReadStringLength()); } } @@ -761,10 +762,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); - } - - if (obj instanceof Blob) { + } else if (obj instanceof Blob) { blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } else if (obj instanceof String) { + result.addReadStringLength(((String) obj).length()); } return obj; @@ -777,10 +778,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); - } - - if (obj instanceof Blob) { + } else if (obj instanceof Blob) { blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } else if (obj instanceof String) { + result.addReadStringLength(((String) obj).length()); } return obj; @@ -792,10 +793,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); - } - - if (obj instanceof Blob) { + } else if (obj instanceof Blob) { blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } else if (obj instanceof String) { + result.addReadStringLength(((String) obj).length()); } return obj; @@ -808,10 +809,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (obj instanceof Clob) { clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); - } - - if (obj instanceof Blob) { + } else if (obj instanceof Blob) { blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } else if (obj instanceof String) { + result.addReadStringLength(((String) obj).length()); } return obj; @@ -915,4 +916,26 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { StatFilterContext.getInstance().clob_open(); } + + @Override + public String resultSet_getString(FilterChain chain, ResultSetProxy result, int columnIndex) throws SQLException { + String value = chain.resultSet_getString(result, columnIndex); + + if (value != null) { + result.addReadStringLength(value.length()); + } + + return value; + } + + @Override + public String resultSet_getString(FilterChain chain, ResultSetProxy result, String columnLabel) throws SQLException { + String value = chain.resultSet_getString(result, columnLabel); + + if (value != null) { + result.addReadStringLength(value.length()); + } + + return value; + } } diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxy.java b/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxy.java index f6a6ff7ef2..e7bd92d6ca 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxy.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxy.java @@ -43,4 +43,8 @@ public interface ResultSetProxy extends ResultSet, WrapperProxy { void setConstructNano(); int getCloseCount(); + + void addReadStringLength(int length); + + long getReadStringLength(); } diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxyImpl.java index 45017f8596..6e8791f065 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxyImpl.java @@ -51,11 +51,13 @@ public class ResultSetProxyImpl extends WrapperProxyImpl implements ResultSetPro private final StatementProxy statement; private final String sql; - protected int cursorIndex = 0; - protected int fetchRowCount = 0; + protected int cursorIndex = 0; + protected int fetchRowCount = 0; protected long constructNano; protected final JdbcSqlStat sqlStat; - private int closeCount = 0; + private int closeCount = 0; + + private long readStringLength = 0; public ResultSetProxyImpl(StatementProxy statement, ResultSet resultSet, long id, String sql){ super(resultSet, id); @@ -1078,4 +1080,14 @@ public class ResultSetProxyImpl extends WrapperProxyImpl implements ResultSetPro return closeCount; } + @Override + public void addReadStringLength(int length) { + this.readStringLength += length; + } + + @Override + public long getReadStringLength() { + return readStringLength; + } + } diff --git a/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java b/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java index 01770643e5..6a89f230fc 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java @@ -77,6 +77,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { private final AtomicLong clobOpenCount = new AtomicLong(); private final AtomicLong blobOpenCount = new AtomicLong(); + private final AtomicLong stringReadLength = new AtomicLong(); private final Histogram histogram = new Histogram(new long[] { // // @@ -226,6 +227,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { blobOpenCount.set(0); clobOpenCount.set(0); + stringReadLength.set(0); } public long getConcurrentMax() { @@ -274,14 +276,22 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { public void incrementClobOpenCount() { clobOpenCount.incrementAndGet(); } - + public long getBlobOpenCount() { return blobOpenCount.get(); } - + public void incrementBlobOpenCount() { blobOpenCount.incrementAndGet(); } + + public long getStringReadLength() { + return stringReadLength.get(); + } + + public void addStringReadLength(long length) { + this.stringReadLength.addAndGet(length); + } public long getId() { return id; @@ -505,9 +515,10 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { SimpleType.LONG, // SimpleType.LONG, // SimpleType.LONG, // - + // 35 - SimpleType.LONG, // + SimpleType.LONG, // }; @@ -560,9 +571,10 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { "EffectedRowCountMax", // "FetchRowCountMax", // "ClobOpenCount", - + // 35 - "BlobOpenCount", + "StringReadLength", // }; @@ -634,8 +646,9 @@ 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 + map.put("StringReadLength", getStringReadLength()); // 36 return map; } diff --git a/src/main/resources/support/http/resources/sql-detail.html b/src/main/resources/support/http/resources/sql-detail.html index 8cfaf38f1d..d1312510eb 100644 --- a/src/main/resources/support/http/resources/sql-detail.html +++ b/src/main/resources/support/http/resources/sql-detail.html @@ -85,7 +85,7 @@
-

Batch View:

+

Other View:

@@ -95,6 +95,18 @@ + + + + + + + + + + + +
BatchSizeMaxBatchSizeTotal
BlobOpenCount
ClobOpenCount
StringReadLength
Close @@ -141,6 +153,9 @@ $("#BatchSizeMax").text(sqlInfo.BatchSizeMax) $("#BatchSizeTotal").text(sqlInfo.BatchSizeTotal) + $("#BlobOpenCount").text(sqlInfo.BlobOpenCount) + $("#ClobOpenCount").text(sqlInfo.ClobOpenCount) + $("#StringReadLength").text(sqlInfo.StringReadLength) }, dataType: "json" });