From 8c5bb64929c2d3ef26104677d021ae852940f59f Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 16 Nov 2011 10:10:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=9B=A0=E4=B8=BASqlStat=20O?= =?UTF-8?q?OM=E9=98=B2=E6=AD=A2=E6=8E=AA=E6=96=BD=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E7=A9=BA=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alibaba/druid/filter/stat/StatFilter.java | 43 +++++++++++++------ .../bvt/pool/TestPoolPreparedStatement.java | 2 + .../bvt/pool/TestPoolPreparedStatement2.java | 16 +++++-- 3 files changed, 45 insertions(+), 16 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 afc97e1221..142f647aa7 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -30,6 +30,8 @@ import javax.management.openmbean.TabularData; import com.alibaba.druid.filter.Filter; import com.alibaba.druid.filter.FilterChain; import com.alibaba.druid.filter.FilterEventAdapter; +import com.alibaba.druid.logging.Log; +import com.alibaba.druid.logging.LogFactory; import com.alibaba.druid.proxy.jdbc.CallableStatementProxy; import com.alibaba.druid.proxy.jdbc.ConnectionProxy; import com.alibaba.druid.proxy.jdbc.DataSourceProxy; @@ -51,6 +53,8 @@ import com.alibaba.druid.util.TransactionInfo; */ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { + 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"; @@ -318,8 +322,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { statement.getAttributes().put(ATTR_SQL, sqlStat); } - sqlStat.addExecuteBatchCount(batchSize); - + if (sqlStat != null) { + sqlStat.addExecuteBatchCount(batchSize); + } + internalBeforeStatementExecute(statement, sql); // super.statementExecuteBatchBefore(statement); @@ -363,8 +369,11 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { sqlStat.setName(statContext.getName()); sqlStat.setFile(statContext.getFile()); } - sqlStat.setExecuteLastStartTime(System.currentTimeMillis()); - sqlStat.incrementRunningCount(); + + if (sqlStat != null) { + sqlStat.setExecuteLastStartTime(System.currentTimeMillis()); + sqlStat.incrementRunningCount(); + } statement.getAttributes().put(ATTR_UPDATE_COUNT, 0); } @@ -400,13 +409,15 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { // // SQL final JdbcSqlStat sqlStat = getSqlStat(statement); - sqlStat.incrementExecuteSuccessCount(); - for (int updateCount : updateCountArray) { - sqlStat.addUpdateCount(updateCount); - } + if (sqlStat != null) { + sqlStat.incrementExecuteSuccessCount(); + for (int updateCount : updateCountArray) { + sqlStat.addUpdateCount(updateCount); + } - sqlStat.decrementExecutingCount(); - sqlStat.addExecuteTime(nanoSpan); + sqlStat.decrementExecutingCount(); + sqlStat.addExecuteTime(nanoSpan); + } if (updateCountArray.length == 1) { statement.getAttributes().put(ATTR_UPDATE_COUNT, updateCountArray[0]); @@ -432,8 +443,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { // SQL JdbcSqlStat sqlStat = getSqlStat(statement); - sqlStat.error(error); - sqlStat.addExecuteTime(nanoSpan); + if (sqlStat != null) { + sqlStat.error(error); + sqlStat.addExecuteTime(nanoSpan); + } super.statement_executeErrorAfter(statement, sql, error); } @@ -675,7 +688,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { if (dataSourceStat.getSqlStatMap().size() >= maxSqlStatCount) { return null; } - + JdbcSqlStat newSqlStat = new JdbcSqlStat(sql); if (dataSourceStat.getSqlStatMap().putIfAbsent(sql, newSqlStat) == null) { newSqlStat.setId(JdbcStatManager.getInstance().generateSqlId()); @@ -685,6 +698,10 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { sqlStat = dataSourceStat.getSqlStatMap().get(sql); } + if (sqlStat == null) { + LOG.error("stat is null"); + } + return sqlStat; } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement.java b/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement.java index 150f676672..a09a468035 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement.java @@ -49,6 +49,7 @@ public class TestPoolPreparedStatement extends TestCase { Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT ?"); raw = stmt.unwrap(MockPreparedStatement.class); + stmt.execute(); stmt.close(); conn.close(); } @@ -57,6 +58,7 @@ public class TestPoolPreparedStatement extends TestCase { Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT ?"); Assert.assertTrue(raw == stmt.unwrap(MockPreparedStatement.class)); + stmt.execute(); stmt.close(); conn.close(); } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement2.java b/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement2.java index 50d6e1c900..30b183ad0f 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement2.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement2.java @@ -7,8 +7,8 @@ import junit.framework.Assert; import junit.framework.TestCase; import com.alibaba.druid.mock.MockDriver; -import com.alibaba.druid.mock.MockPreparedStatement; import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.PoolableConnection; import com.alibaba.druid.stat.DruidDataSourceStatManager; public class TestPoolPreparedStatement2 extends TestCase { @@ -18,7 +18,7 @@ public class TestPoolPreparedStatement2 extends TestCase { protected void setUp() throws Exception { Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size()); - + driver = new MockDriver(); dataSource = new DruidDataSource(); @@ -45,13 +45,23 @@ public class TestPoolPreparedStatement2 extends TestCase { public void test_stmtCache() throws Exception { - for (int i = 0; i < 1000 * 1000 * 10; ++i){ + for (int i = 0; i < 1000 * 100 * 1; ++i) { Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT " + i); + stmt.execute(); stmt.close(); conn.close(); } + Connection conn = dataSource.getConnection(); + PoolableConnection poolableConn = conn.unwrap(PoolableConnection.class); + Assert.assertNotNull(poolableConn); + + Assert.assertEquals(dataSource.getMaxPoolPreparedStatementPerConnectionSize(), + poolableConn.getConnectionHolder().getStatementPool().getMap().size()); + + conn.close(); + Assert.assertEquals(0, dataSource.getActiveCount()); Assert.assertEquals(1, dataSource.getPoolingCount()); }