slow sql parameter record

This commit is contained in:
温少
2012-03-17 04:19:31 +08:00
parent 2df78b18da
commit cd632cd8f1
5 changed files with 75 additions and 17 deletions
@@ -15,9 +15,15 @@
*/
package com.alibaba.druid.filter.stat;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.NClob;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
@@ -50,27 +56,30 @@ import com.alibaba.druid.stat.JdbcStatementStat;
*/
public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
private final static Log LOG = LogFactory.getLog(StatFilter.class);
private final static Log LOG = LogFactory.getLog(StatFilter.class);
public final static String ATTR_SQL = "stat.sql";
public final static String ATTR_UPDATE_COUNT = "stat.updteCount";
public final static String ATTR_TRANSACTION = "stat.tx";
public final static String ATTR_SQL = "stat.sql";
public final static String ATTR_UPDATE_COUNT = "stat.updteCount";
public final static String ATTR_TRANSACTION = "stat.tx";
protected JdbcDataSourceStat dataSourceStat;
protected JdbcDataSourceStat dataSourceStat;
@Deprecated
protected final JdbcStatementStat statementStat = JdbcStatManager.getInstance().getStatementStat();
protected final JdbcStatementStat statementStat = JdbcStatManager.getInstance().getStatementStat();
@Deprecated
protected final JdbcResultSetStat resultSetStat = JdbcStatManager.getInstance().getResultSetStat();
protected final JdbcResultSetStat resultSetStat = JdbcStatManager.getInstance().getResultSetStat();
private boolean connectionStackTraceEnable = false;
private boolean connectionStackTraceEnable = false;
protected DataSourceProxy dataSource;
protected DataSourceProxy dataSource;
protected final AtomicLong resetCount = new AtomicLong();
protected final AtomicLong resetCount = new AtomicLong();
protected int maxSqlStatCount = 1000 * 100;
protected int maxSqlStatCount = 1000 * 10;
// 3 seconds is slow sql
protected long slowSqlMillis = 3 * 1000;
public StatFilter(){
String property = System.getProperty("druid.stat.maxSqlStatCount");
@@ -78,7 +87,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
try {
maxSqlStatCount = Integer.parseInt(property);
} catch (Exception e) {
LOG.error("get property error 'druid.stat.maxSqlStatCount' : " + property);
}
}
}
@@ -251,8 +260,6 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
@Override
protected void statementExecuteUpdateAfter(StatementProxy statement, String sql, int updateCount) {
internalAfterStatementExecute(statement, updateCount);
// super.statementExecuteUpdateAfter(statement, sql, updateCount);
}
@Override
@@ -396,6 +403,36 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
sqlStat.decrementExecutingCount();
sqlStat.addExecuteTime(nanoSpan);
long millis = nanoSpan / (1000 * 1000);
if (millis >= slowSqlMillis) {
List<String> lastSlowParameters = new ArrayList<String>();
for (Object value : statement.getParameters().values()) {
if (value == null) {
lastSlowParameters.add("null");
} else if (value instanceof String) {
lastSlowParameters.add("'" + value.toString() + "'");
} else if (value instanceof Number) {
lastSlowParameters.add(value.toString());
} else if (value instanceof java.util.Date) {
java.util.Date date = (java.util.Date) value;
lastSlowParameters.add(date.getClass().getSimpleName() + "(" + date.getTime() + ")");
} else if (value instanceof Boolean) {
lastSlowParameters.add(value.toString());
} else if (value instanceof InputStream) {
lastSlowParameters.add("<InputStream>");
} else if (value instanceof Clob) {
lastSlowParameters.add("<Clob>");
} else if (value instanceof NClob) {
lastSlowParameters.add("<NClob>");
} else if (value instanceof Blob) {
lastSlowParameters.add("<Blob>");
} else {
lastSlowParameters.add("<" + value.getClass() + ">");
}
}
sqlStat.setLastSlowParameters(lastSlowParameters);
}
}
if (updateCountArray.length == 1) {
@@ -17,6 +17,7 @@ package com.alibaba.druid.proxy.jdbc;
import java.sql.Statement;
import java.util.List;
import java.util.Map;
/**
* @author wenshao<szujobs@hotmail.com>
@@ -32,4 +33,6 @@ public interface StatementProxy extends Statement, WrapperProxy {
String getBatchSql();
String getLastExecuteSql();
Map<Integer, JdbcParameter> getParameters();
}
@@ -22,7 +22,9 @@ import java.sql.SQLFeatureNotSupportedException;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.alibaba.druid.filter.FilterChain;
import com.alibaba.druid.filter.FilterChainImpl;
@@ -323,4 +325,9 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro
return super.unwrap(iface);
}
@Override
public Map<Integer, JdbcParameter> getParameters() {
return Collections.emptyMap();
}
}
@@ -164,7 +164,7 @@ public class JdbcResultSetStat implements JdbcResultSetStatMBean {
@Override
public long getHoldMillisTotal() {
return JdbcStatManager.getInstance().getResultSetStat().getAliveNanoTotal() / (1000 * 1000);
return getAliveNanoTotal() / (1000 * 1000);
}
@Override
@@ -17,6 +17,7 @@ package com.alibaba.druid.stat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
@@ -64,6 +65,8 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
private final AtomicLong inTransactionCount = new AtomicLong();
private List<String> lastSlowParameters;
private final Histogram histogram = new Histogram(new long[] { //
//
1, 10, 100, 1000, 10 * 1000, //
@@ -75,6 +78,14 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
this.sql = sql;
}
public List<String> getLastSlowParameters() {
return lastSlowParameters;
}
public void setLastSlowParameters(List<String> lastSlowParameters) {
this.lastSlowParameters = lastSlowParameters;
}
public String getDbType() {
return dbType;
}