refactor StatFilter buildSlowParameters

This commit is contained in:
wenshao
2012-08-23 08:33:36 +08:00
parent 31e4abd71f
commit f38a6c6c95
5 changed files with 245 additions and 6 deletions
@@ -460,7 +460,7 @@ public abstract class FilterEventAdapter extends FilterAdapter {
try {
statementExecuteQueryBefore(statement, statement.getSql());
ResultSetProxy resultSet = super.preparedStatement_executeQuery(chain, statement);
ResultSetProxy resultSet = chain.preparedStatement_executeQuery(statement);
statementExecuteQueryAfter(statement, statement.getSql(), resultSet);
@@ -526,10 +526,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
out.writeObject(value);
} else if (value instanceof InputStream) {
out.writeString("<InputStream>");
} else if (value instanceof Clob) {
out.writeString("<Clob>");
} else if (value instanceof NClob) {
out.writeString("<NClob>");
} else if (value instanceof Clob) {
out.writeString("<Clob>");
} else if (value instanceof Blob) {
out.writeString("<Blob>");
} else {
@@ -45,7 +45,7 @@ public class MockPreparedStatement extends PreparedStatementBase implements Mock
MockConnection conn = getConnection();
if (conn != null && conn.getDriver() != null) {
return getConnection().getDriver().createResultSet(this);
return conn.getDriver().executeQuery(this, sql);
}
if (conn != null) {
@@ -6,6 +6,9 @@ import java.sql.Timestamp;
import java.sql.Types;
import java.util.List;
import org.apache.derby.iapi.types.SQLVarchar;
import com.alibaba.druid.mock.MockPreparedStatement;
import com.alibaba.druid.mock.MockResultSet;
import com.alibaba.druid.mock.MockResultSetMetaData;
import com.alibaba.druid.mock.MockStatementBase;
@@ -19,6 +22,7 @@ import com.alibaba.druid.sql.ast.expr.SQLNCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumberExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
@@ -138,9 +142,17 @@ public class MySqlMockExecuteHandlerImpl implements MockExecuteHandler {
} else {
throw new SQLException("TODO");
}
} else if (expr instanceof SQLVariantRefExpr) {
SQLVariantRefExpr varExpr = (SQLVariantRefExpr) expr;
int varIndex = varExpr.getIndex();
if (statement instanceof MockPreparedStatement) {
MockPreparedStatement mockPstmt = (MockPreparedStatement) statement;
row[i] = mockPstmt.getParameters().get(varIndex);
} else {
row[i] = null;
}
} else {
throw new SQLException("TODO");
row[i] = null;
}
metaData.getColumns().add(column);
@@ -0,0 +1,227 @@
package com.alibaba.druid.bvt.filter;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import junit.framework.TestCase;
import org.junit.Assert;
import org.nutz.lang.util.ByteInputStream;
import com.alibaba.druid.mock.MockBlob;
import com.alibaba.druid.mock.MockClob;
import com.alibaba.druid.mock.MockDriver;
import com.alibaba.druid.mock.MockNClob;
import com.alibaba.druid.mock.MockRowId;
import com.alibaba.druid.mock.MockStatementBase;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.stat.JdbcSqlStat;
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.druid.util.JdbcUtils;
public class StatFilterBuildSlowParameterTest extends TestCase {
private DruidDataSource dataSource;
protected void setUp() throws Exception {
dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setFilters("stat");
dataSource.setTestOnBorrow(false);
dataSource.setConnectionProperties("druid.stat.slowSqlMillis=1");
MockDriver driver = new MockDriver() {
public ResultSet executeQuery(MockStatementBase stmt, String sql) throws SQLException {
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
return super.executeQuery(stmt, sql);
}
};
dataSource.setDriver(driver);
dataSource.init();
}
protected void tearDown() throws Exception {
JdbcUtils.close(dataSource);
}
public void test_buildSlowSql() throws Exception {
long currentMillis = System.currentTimeMillis();
String sql = "select ?, ?, ?, ?, ?";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
String dateText = dateFormat.format(date);
{
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setBoolean(1, true);
stmt.setInt(2, 123);
stmt.setLong(3, 10001);
stmt.setTimestamp(4, new java.sql.Timestamp(currentMillis));
stmt.setDate(5, new java.sql.Date(currentMillis));
ResultSet rs = stmt.executeQuery();
rs.close();
stmt.close();
conn.close();
// //////
JdbcSqlStat sqlStat = dataSource.getDataSourceStat().getSqlStat(sql);
Assert.assertNotNull(sqlStat);
String slowParameters = sqlStat.getLastSlowParameters();
Assert.assertNotNull(slowParameters);
List<Object> parameters = (List<Object>) JSONUtils.parse(slowParameters);
Assert.assertEquals(5, parameters.size());
Assert.assertEquals(true, parameters.get(0));
Assert.assertEquals(123, parameters.get(1));
Assert.assertEquals(10001, parameters.get(2));
Assert.assertEquals(dateText, parameters.get(3));
Assert.assertEquals(dateText, parameters.get(4));
}
currentMillis = System.currentTimeMillis();
date = new Date(System.currentTimeMillis());
dateText = dateFormat.format(date);
{
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setBoolean(1, false);
stmt.setInt(2, 234);
stmt.setLong(3, 10002);
stmt.setTimestamp(4, new java.sql.Timestamp(currentMillis));
stmt.setDate(5, new java.sql.Date(currentMillis));
ResultSet rs = stmt.executeQuery();
rs.close();
stmt.close();
conn.close();
// //////
JdbcSqlStat sqlStat = dataSource.getDataSourceStat().getSqlStat(sql);
Assert.assertNotNull(sqlStat);
String slowParameters = sqlStat.getLastSlowParameters();
Assert.assertNotNull(slowParameters);
List<Object> parameters = (List<Object>) JSONUtils.parse(slowParameters);
Assert.assertEquals(5, parameters.size());
Assert.assertEquals(false, parameters.get(0));
Assert.assertEquals(234, parameters.get(1));
Assert.assertEquals(10002, parameters.get(2));
Assert.assertEquals(dateText, parameters.get(3));
Assert.assertEquals(dateText, parameters.get(4));
}
{
StringBuilder buf = new StringBuilder();
for (int i = 0; i < 10; ++i) {
buf.append("abcdefghijklmnABCDEFGHIJKLMN1234567890!@#$%^&*(");
}
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setNull(1, Types.VARCHAR);
stmt.setString(2, buf.toString());
stmt.setClob(3, new MockClob());
stmt.setNClob(4, new MockNClob());
stmt.setBlob(5, new MockBlob());
ResultSet rs = stmt.executeQuery();
rs.close();
stmt.close();
conn.close();
// //////
JdbcSqlStat sqlStat = dataSource.getDataSourceStat().getSqlStat(sql);
Assert.assertNotNull(sqlStat);
String slowParameters = sqlStat.getLastSlowParameters();
Assert.assertNotNull(slowParameters);
List<Object> parameters = (List<Object>) JSONUtils.parse(slowParameters);
Assert.assertEquals(5, parameters.size());
Assert.assertEquals(null, parameters.get(0));
Assert.assertEquals(buf.substring(0, 97) + "...", parameters.get(1));
Assert.assertEquals("<Clob>", parameters.get(2));
Assert.assertEquals("<NClob>", parameters.get(3));
Assert.assertEquals("<Blob>", parameters.get(4));
}
{
StringBuilder buf = new StringBuilder();
for (int i = 0; i < 10; ++i) {
buf.append("中国abcdefghijklmnABCDEFGHIJKLMN1234567890!@#$%^&*(");
}
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setBinaryStream(1, new ByteInputStream(new byte[0]));
stmt.setString(2, buf.toString());
stmt.setTime(3, new Time(currentMillis));
stmt.setBigDecimal(4, new BigDecimal("56789.123"));
stmt.setRowId(5, new MockRowId());
ResultSet rs = stmt.executeQuery();
rs.close();
stmt.close();
conn.close();
// //////
JdbcSqlStat sqlStat = dataSource.getDataSourceStat().getSqlStat(sql);
Assert.assertNotNull(sqlStat);
String slowParameters = sqlStat.getLastSlowParameters();
Assert.assertNotNull(slowParameters);
List<Object> parameters = (List<Object>) JSONUtils.parse(slowParameters);
Assert.assertEquals(5, parameters.size());
Assert.assertEquals("<InputStream>", parameters.get(0));
Assert.assertEquals(buf.substring(0, 97) + "...", parameters.get(1));
Assert.assertEquals(dateText, parameters.get(2));
Assert.assertEquals(56789.123, parameters.get(3));
Assert.assertEquals("<com.alibaba.druid.mock.MockRowId>", parameters.get(4));
}
}
}