From 31e4abd71f92443878080e7b14b6ac92e5f02566 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 23 Aug 2012 07:57:42 +0800 Subject: [PATCH] refactor StatFilter buildSlowParameters --- .../alibaba/druid/filter/stat/StatFilter.java | 71 +++++++------------ .../druid/proxy/jdbc/ClobProxyImpl.java | 4 ++ .../druid/support/json/JSONWriter.java | 36 +++++++--- 3 files changed, 55 insertions(+), 56 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 ceae368ece..f1839236ef 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -47,6 +47,7 @@ import com.alibaba.druid.stat.JdbcSqlStat; import com.alibaba.druid.stat.JdbcStatContext; import com.alibaba.druid.stat.JdbcStatManager; import com.alibaba.druid.stat.JdbcStatementStat; +import com.alibaba.druid.support.json.JSONWriter; import com.alibaba.druid.support.logging.Log; import com.alibaba.druid.support.logging.LogFactory; @@ -456,12 +457,12 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { long millis = nanoSpan / (1000 * 1000); if (millis >= slowSqlMillis) { - StringBuilder buf = buildSlowParameters(statement); - sqlStat.setLastSlowParameters(buf.toString()); + String slowParameters = buildSlowParameters(statement); + sqlStat.setLastSlowParameters(slowParameters); if (logSlowSql) { LOG.error("slow sql " + millis + " millis. \n" + statement.getLastExecuteSql() + "\n" - + buf.toString()); + + slowParameters); } } } @@ -497,70 +498,48 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { StatFilterContext.getInstance().executeAfter(sql, nanoSpan, error); } - private StringBuilder buildSlowParameters(StatementProxy statement) { - StringBuilder buf = new StringBuilder(); - buf.append('['); + private String buildSlowParameters(StatementProxy statement) { + JSONWriter out = new JSONWriter(); + + out.writeArrayStart(); int index = 0; for (JdbcParameter parameter : statement.getParameters().values()) { if (index != 0) { - buf.append(','); + out.writeComma(); } + Object value = parameter.getValue(); if (value == null) { - buf.append("null"); + out.writeNull(); } else if (value instanceof String) { - buf.append('"'); String text = (String) value; if (text.length() > 100) { - for (int i = 0; i < 97; ++i) { - char ch = text.charAt(i); - if (ch == '\'') { - buf.append('\\'); - buf.append(ch); - } else { - buf.append(ch); - } - } - buf.append("..."); + out.writeString(text.substring(0, 97) + "..."); } else { - for (int i = 0; i < text.length(); ++i) { - char ch = text.charAt(i); - if (ch == '\'') { - buf.append('\\'); - buf.append(ch); - } else { - buf.append(ch); - } - } + out.writeString(text); } - buf.append('"'); } else if (value instanceof Number) { - buf.append(value.toString()); + out.writeObject(value); } else if (value instanceof java.util.Date) { - java.util.Date date = (java.util.Date) value; - buf.append(date.getClass().getSimpleName()); - buf.append('('); - buf.append(date.getTime()); - buf.append(')'); + out.writeObject(value); } else if (value instanceof Boolean) { - buf.append(value.toString()); + out.writeObject(value); } else if (value instanceof InputStream) { - buf.append(""); + out.writeString(""); } else if (value instanceof Clob) { - buf.append(""); + out.writeString(""); } else if (value instanceof NClob) { - buf.append(""); + out.writeString(""); } else if (value instanceof Blob) { - buf.append(""); + out.writeString(""); } else { - buf.append('<'); - buf.append(value.getClass().getName()); - buf.append('>'); + out.writeString('<' + value.getClass().getName() + '>'); } index++; } - buf.append(']'); - return buf; + out.writeArrayEnd(); + + return out.toString(); } @Override @@ -831,7 +810,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { private void clobOpenAfter(JdbcDataSourceStat dataSourceStat, StatementProxy stmt, ClobProxy clob) { dataSourceStat.incrementClobOpenCount(); - + if (stmt != null) { JdbcSqlStat sqlStat = stmt.getSqlStat(); if (sqlStat != null) { diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/ClobProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/ClobProxyImpl.java index 59476396e3..c8f0879487 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/ClobProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/ClobProxyImpl.java @@ -36,6 +36,10 @@ public class ClobProxyImpl implements ClobProxy { protected final DataSourceProxy dataSource; public ClobProxyImpl(DataSourceProxy dataSource, ConnectionProxy connection, Clob clob){ + if (clob == null) { + throw new IllegalArgumentException("clob is null"); + } + this.dataSource = dataSource; this.connection = connection; this.clob = clob; diff --git a/src/main/java/com/alibaba/druid/support/json/JSONWriter.java b/src/main/java/com/alibaba/druid/support/json/JSONWriter.java index 2f0448bde6..0938c661c4 100644 --- a/src/main/java/com/alibaba/druid/support/json/JSONWriter.java +++ b/src/main/java/com/alibaba/druid/support/json/JSONWriter.java @@ -20,10 +20,26 @@ public class JSONWriter { this.out = new StringBuilder(); } + public void writeArrayStart() { + write('['); + } + + public void writeComma() { + write(','); + } + + public void writeArrayEnd() { + write(']'); + } + + public void writeNull() { + write("null"); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) public void writeObject(Object o) { if (o == null) { - write("null"); + writeNull(); return; } @@ -87,12 +103,12 @@ public class JSONWriter { writeTabularData((TabularData) o); return; } - + if (o instanceof CompositeData) { writeCompositeData((CompositeData) o); return; } - + if (o instanceof Map) { writeMap((Map) o); return; @@ -103,7 +119,7 @@ public class JSONWriter { public void writeDate(Date date) { if (date == null) { - write("null"); + writeNull(); return; } @@ -112,7 +128,7 @@ public class JSONWriter { public void writeError(Throwable error) { if (error == null) { - write("null"); + writeNull(); return; } @@ -127,7 +143,7 @@ public class JSONWriter { public void writeArray(Object[] array) { if (array == null) { - write("null"); + writeNull(); return; } @@ -145,7 +161,7 @@ public class JSONWriter { public void writeArray(Collection list) { if (list == null) { - write("null"); + writeNull(); return; } @@ -184,7 +200,7 @@ public class JSONWriter { public void writeTabularData(TabularData tabularData) { if (tabularData == null) { - write("null"); + writeNull(); return; } @@ -205,7 +221,7 @@ public class JSONWriter { public void writeCompositeData(CompositeData compositeData) { if (compositeData == null) { - write("null"); + writeNull(); return; } @@ -228,7 +244,7 @@ public class JSONWriter { public void writeMap(Map map) { if (map == null) { - write("null"); + writeNull(); return; }