From 5a83edf5235adb3e089d0bb986c914e2f8f4bf8f Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 7 Aug 2012 10:47:14 +0800 Subject: [PATCH] bug fixed for StatFitler --- .../alibaba/druid/filter/stat/StatFilter.java | 16 ++++++++-------- .../java/com/alibaba/druid/mock/MockDriver.java | 4 ++-- .../druid/mock/MockPreparedStatement.java | 2 +- .../com/alibaba/druid/mock/MockStatement.java | 4 ++-- .../druid/mock/handler/MockExecuteHandler.java | 4 ++-- .../handler/MySqlMockExecuteHandlerImpl.java | 10 +++++----- .../com/alibaba/druid/pool/DruidDataSource.java | 16 +++++++++++++++- .../ha/MultiDataSourcePreparedStatement.java | 5 +++-- .../proxy/jdbc/PreparedStatementProxyImpl.java | 2 ++ .../druid/proxy/jdbc/StatementProxyImpl.java | 6 ++++++ .../java/com/alibaba/druid/stat/JdbcSqlStat.java | 4 ++-- 11 files changed, 48 insertions(+), 25 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 3241a5a6d9..2ffd9e4e89 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -312,7 +312,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { @Override protected void statementExecuteUpdateAfter(StatementProxy statement, String sql, int updateCount) { - internalAfterStatementExecute(statement, updateCount); + internalAfterStatementExecute(statement, false, updateCount); } @Override @@ -322,7 +322,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { @Override protected void statementExecuteQueryAfter(StatementProxy statement, String sql, ResultSetProxy resultSet) { - internalAfterStatementExecute(statement); + internalAfterStatementExecute(statement, true); } @Override @@ -331,8 +331,8 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { } @Override - protected void statementExecuteAfter(StatementProxy statement, String sql, boolean result) { - internalAfterStatementExecute(statement); + protected void statementExecuteAfter(StatementProxy statement, String sql, boolean firstResult) { + internalAfterStatementExecute(statement, firstResult); } @Override @@ -356,7 +356,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { @Override protected void statementExecuteBatchAfter(StatementProxy statement, int[] result) { - internalAfterStatementExecute(statement, result); + internalAfterStatementExecute(statement, false, result); } @@ -406,7 +406,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { } } - private final void internalAfterStatementExecute(StatementProxy statement, int... updateCountArray) { + private final void internalAfterStatementExecute(StatementProxy statement, boolean firstResult, int... updateCountArray) { final JdbcStatementStat.Entry entry = getStatementInfo(statement); @@ -426,7 +426,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { } sqlStat.decrementRunningCount(); - sqlStat.addExecuteTime(statement.getLastExecuteType(), nanoSpan); + sqlStat.addExecuteTime(statement.getLastExecuteType(), firstResult, nanoSpan); statement.setLastExecuteTimeNano(nanoSpan); if ((!statement.isFirstResultSet()) && statement.getLastExecuteType() == StatementExecuteType.Execute) { try { @@ -525,7 +525,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (sqlStat != null) { sqlStat.error(error); - sqlStat.addExecuteTime(statement.getLastExecuteType(), nanoSpan); + sqlStat.addExecuteTime(statement.getLastExecuteType(), statement.isFirstResultSet(), nanoSpan); statement.setLastExecuteTimeNano(nanoSpan); } diff --git a/src/main/java/com/alibaba/druid/mock/MockDriver.java b/src/main/java/com/alibaba/druid/mock/MockDriver.java index 7c3447d95c..c4e99d5061 100644 --- a/src/main/java/com/alibaba/druid/mock/MockDriver.java +++ b/src/main/java/com/alibaba/druid/mock/MockDriver.java @@ -235,12 +235,12 @@ public class MockDriver implements Driver, MockDriverMBean { return true; } - protected ResultSet executeQuery(MockStatement stmt, String sql) throws SQLException { + public ResultSet executeQuery(MockStatementBase stmt, String sql) throws SQLException { if (logExecuteQueryEnable && LOG.isDebugEnabled()) { LOG.debug("executeQuery " + sql); } - MockConnection conn = stmt.getMockConnection(); + MockConnection conn = stmt.getConnection(); long idleTimeMillis = System.currentTimeMillis() - conn.getLastActiveTimeMillis(); if (idleTimeMillis >= this.idleTimeCount) { diff --git a/src/main/java/com/alibaba/druid/mock/MockPreparedStatement.java b/src/main/java/com/alibaba/druid/mock/MockPreparedStatement.java index aac0e05575..ff69946319 100644 --- a/src/main/java/com/alibaba/druid/mock/MockPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/mock/MockPreparedStatement.java @@ -21,7 +21,7 @@ import java.sql.SQLException; import com.alibaba.druid.util.jdbc.PreparedStatementBase; -public class MockPreparedStatement extends PreparedStatementBase implements PreparedStatement { +public class MockPreparedStatement extends PreparedStatementBase implements MockStatementBase, PreparedStatement { private final String sql; diff --git a/src/main/java/com/alibaba/druid/mock/MockStatement.java b/src/main/java/com/alibaba/druid/mock/MockStatement.java index 3ff6c4c592..6bbf5394d1 100644 --- a/src/main/java/com/alibaba/druid/mock/MockStatement.java +++ b/src/main/java/com/alibaba/druid/mock/MockStatement.java @@ -22,7 +22,7 @@ import java.sql.Statement; import com.alibaba.druid.util.jdbc.StatementBase; -public class MockStatement extends StatementBase implements Statement { +public class MockStatement extends StatementBase implements MockStatementBase, Statement { public final static String ERROR_SQL = "THROW ERROR"; @@ -46,7 +46,7 @@ public class MockStatement extends StatementBase implements Statement { } } - public MockConnection getMockConnection() { + public MockConnection getConnection() { return mockConnection; } diff --git a/src/main/java/com/alibaba/druid/mock/handler/MockExecuteHandler.java b/src/main/java/com/alibaba/druid/mock/handler/MockExecuteHandler.java index 2d225ea02a..ffd2f67345 100644 --- a/src/main/java/com/alibaba/druid/mock/handler/MockExecuteHandler.java +++ b/src/main/java/com/alibaba/druid/mock/handler/MockExecuteHandler.java @@ -3,9 +3,9 @@ package com.alibaba.druid.mock.handler; import java.sql.ResultSet; import java.sql.SQLException; -import com.alibaba.druid.mock.MockStatement; +import com.alibaba.druid.mock.MockStatementBase; public interface MockExecuteHandler { - ResultSet executeQuery(MockStatement statement, String sql) throws SQLException; + ResultSet executeQuery(MockStatementBase statement, String sql) throws SQLException; } diff --git a/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java b/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java index 03d27b5121..14d348acf9 100644 --- a/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java +++ b/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java @@ -8,7 +8,7 @@ import java.util.List; import com.alibaba.druid.mock.MockResultSet; import com.alibaba.druid.mock.MockResultSetMetaData; -import com.alibaba.druid.mock.MockStatement; +import com.alibaba.druid.mock.MockStatementBase; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -35,7 +35,7 @@ import com.alibaba.druid.util.jdbc.ResultSetMetaDataBase.ColumnMetaData; public class MySqlMockExecuteHandlerImpl implements MockExecuteHandler { @Override - public ResultSet executeQuery(MockStatement statement, String sql) throws SQLException { + public ResultSet executeQuery(MockStatementBase statement, String sql) throws SQLException { SQLStatementParser parser = new MySqlStatementParser(sql); List stmtList = parser.parseStatementList(); // @@ -67,7 +67,7 @@ public class MySqlMockExecuteHandlerImpl implements MockExecuteHandler { throw new SQLException("TODO"); } - public ResultSet executeQuery(MockStatement statement, SQLSelectQueryBlock query) throws SQLException { + public ResultSet executeQuery(MockStatementBase statement, SQLSelectQueryBlock query) throws SQLException { SQLTableSource from = query.getFrom(); if (from instanceof SQLExprTableSource) { @@ -87,7 +87,7 @@ public class MySqlMockExecuteHandlerImpl implements MockExecuteHandler { } } - public ResultSet showStatus(MockStatement statement) throws SQLException { + public ResultSet showStatus(MockStatementBase statement) throws SQLException { MockResultSet rs = new MockResultSet(statement); MockResultSetMetaData metaData = rs.getMockMetaData(); @@ -102,7 +102,7 @@ public class MySqlMockExecuteHandlerImpl implements MockExecuteHandler { return rs; } - public ResultSet executeQueryFromDual(MockStatement statement, SQLSelectQueryBlock query) throws SQLException { + public ResultSet executeQueryFromDual(MockStatementBase statement, SQLSelectQueryBlock query) throws SQLException { MockResultSet rs = new MockResultSet(statement); MockResultSetMetaData metaData = rs.getMockMetaData(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 47cdfa6bf5..f29afaa9af 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -277,7 +277,21 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat if (isTestOnBorrow() || isTestOnReturn() || isTestWhileIdle()) { if (this.getValidationQuery() == null || this.getValidationQuery().length() == 0) { - LOG.error("validationQuery not set"); + String errorMessage = ""; + + if (isTestOnBorrow()) { + errorMessage += "testOnBorrow is true, "; + } + + if (isTestOnReturn()) { + errorMessage += "testOnReturn is true, "; + } + + if (isTestWhileIdle()) { + errorMessage += "testWhileIdle is true, "; + } + + LOG.error(errorMessage + "validationQuery not set"); } } diff --git a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourcePreparedStatement.java b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourcePreparedStatement.java index 89c5e3a7bd..13b4995ba2 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourcePreparedStatement.java +++ b/src/main/java/com/alibaba/druid/pool/ha/MultiDataSourcePreparedStatement.java @@ -26,10 +26,11 @@ public class MultiDataSourcePreparedStatement extends PreparedStatementProxyImpl FilterChain chain = createChain(); if (chain.getFilterSize() == 0) { - return this.statement.execute(); + firstResultSet = this.statement.execute(); + } else { + firstResultSet = chain.preparedStatement_execute(this); } - firstResultSet = chain.preparedStatement_execute(this); return firstResultSet; } diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java index 5ce80d0557..ad26d7b631 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java @@ -93,6 +93,7 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr @Override public ResultSet executeQuery() throws SQLException { + firstResultSet = true; updateCount = null; lastExecuteType = StatementExecuteType.ExecuteQuery; return createChain().preparedStatement_executeQuery(this); @@ -100,6 +101,7 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr @Override public int executeUpdate() throws SQLException { + firstResultSet = false; lastExecuteType = StatementExecuteType.ExecuteUpdate; updateCount = createChain().preparedStatement_executeUpdate(this); return updateCount; diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/StatementProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/StatementProxyImpl.java index 1908704e2d..4eeba26887 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/StatementProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/StatementProxyImpl.java @@ -141,6 +141,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro @Override public int[] executeBatch() throws SQLException { + firstResultSet = false; lastExecuteType = StatementExecuteType.ExecuteBatch; int[] updateCounts = createChain().statement_executeBatch(this); @@ -153,6 +154,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro @Override public ResultSet executeQuery(String sql) throws SQLException { + firstResultSet = true; updateCount = null; lastExecuteSql = sql; lastExecuteType = StatementExecuteType.ExecuteQuery; @@ -161,6 +163,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro @Override public int executeUpdate(String sql) throws SQLException { + firstResultSet = false; lastExecuteSql = sql; lastExecuteType = StatementExecuteType.ExecuteUpdate; updateCount = createChain().statement_executeUpdate(this, sql); @@ -169,6 +172,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro @Override public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { + firstResultSet = false; lastExecuteSql = sql; lastExecuteType = StatementExecuteType.ExecuteUpdate; updateCount = createChain().statement_executeUpdate(this, sql, autoGeneratedKeys); @@ -177,6 +181,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro @Override public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { + firstResultSet = false; lastExecuteSql = sql; lastExecuteType = StatementExecuteType.ExecuteUpdate; updateCount = createChain().statement_executeUpdate(this, sql, columnIndexes); @@ -185,6 +190,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro @Override public int executeUpdate(String sql, String[] columnNames) throws SQLException { + firstResultSet = false; lastExecuteSql = sql; lastExecuteType = StatementExecuteType.ExecuteUpdate; updateCount = createChain().statement_executeUpdate(this, sql, columnNames); diff --git a/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java b/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java index fe6dd287f8..f48d4dbbdf 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcSqlStat.java @@ -336,8 +336,8 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean { return executeSuccessCount.get(); } - public void addExecuteTime(StatementExecuteType executeType, long nanoSpan) { - if (StatementExecuteType.ExecuteQuery != executeType) { + public void addExecuteTime(StatementExecuteType executeType, boolean firstResultSet, long nanoSpan) { + if (StatementExecuteType.ExecuteQuery != executeType && !firstResultSet) { executeAndResultHoldTimeHistogram.record((nanoSpan) / 1000 / 1000); } addExecuteTime(nanoSpan);