From 759fda63122eb795394378f39618e1eb27b26cf5 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 9 Jul 2013 17:39:55 +0800 Subject: [PATCH] add testcase & improve LogFilter support multi-datasource --- pom.xml | 7 -- .../druid/pool/DruidAbstractDataSource.java | 8 +- .../alibaba/druid/pool/DruidDataSource.java | 15 +++- .../druid/bvt/pool/LastActiveTest_0.java | 73 +++++++++++++++++++ .../bvt/sql/mysql/MySqlSelectTest_7.java | 2 +- .../bvt/sql/mysql/MySqlUpdateTest_3.java | 68 +++++++++++++++++ src/test/resources/log4j.properties | 1 + 7 files changed, 161 insertions(+), 13 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/pool/LastActiveTest_0.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_3.java diff --git a/pom.xml b/pom.xml index f380dddfac..2a1a0fd58c 100644 --- a/pom.xml +++ b/pom.xml @@ -429,13 +429,6 @@ test - - org.nutz - nutz - 1.b.40 - test - - junit junit diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 1d9f4ebb9d..10e8015053 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -1310,10 +1310,10 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements this.clearFiltersEnable = clearFiltersEnable; } - private final AtomicLong connectionIdSeed = new AtomicLong(10000); - private final AtomicLong statementIdSeed = new AtomicLong(20000); - private final AtomicLong resultSetIdSeed = new AtomicLong(50000); - private final AtomicLong transactionIdSeed = new AtomicLong(50000); + protected final AtomicLong connectionIdSeed = new AtomicLong(10000); + protected final AtomicLong statementIdSeed = new AtomicLong(20000); + protected final AtomicLong resultSetIdSeed = new AtomicLong(50000); + protected final AtomicLong transactionIdSeed = new AtomicLong(60000); public long createConnectionId() { return connectionIdSeed.incrementAndGet(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 909c478aee..c2e9e6652f 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -497,6 +497,13 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat initStackTrace = IOUtils.toString(Thread.currentThread().getStackTrace()); this.id = DruidDriver.createDataSourceId(); + if (this.id > 1) { + long delta = (this.id - 1) * 100000; + this.connectionIdSeed.addAndGet(delta); + this.statementIdSeed.addAndGet(delta); + this.resultSetIdSeed.addAndGet(delta); + this.transactionIdSeed.addAndGet(delta); + } if (this.dbType == null || this.dbType.length() == 0) { this.dbType = JdbcUtils.getDbType(jdbcUrl, null); @@ -1835,11 +1842,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat try { final int checkCount = poolingCount - minIdle; + final long currentTimeMillis = System.currentTimeMillis(); for (int i = 0; i < checkCount; ++i) { DruidConnectionHolder connection = connections[i]; if (checkTime) { - long idleMillis = System.currentTimeMillis() - connection.getLastActiveTimeMillis(); + long idleMillis = currentTimeMillis - connection.getLastActiveTimeMillis(); if (idleMillis >= minEvictableIdleTimeMillis) { evictList.add(connection); } else { @@ -1864,6 +1872,11 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat Connection connection = item.getConnection(); JdbcUtils.close(connection); destroyCount.incrementAndGet(); + + if (LOG.isDebugEnabled()) { + long idleMillis = System.currentTimeMillis() - item.getLastActiveTimeMillis(); + LOG.debug("connection destroyed. idleMillis : " + idleMillis); + } } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/LastActiveTest_0.java b/src/test/java/com/alibaba/druid/bvt/pool/LastActiveTest_0.java new file mode 100644 index 0000000000..39648ba190 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/LastActiveTest_0.java @@ -0,0 +1,73 @@ +package com.alibaba.druid.bvt.pool; + +import java.lang.reflect.Field; +import java.sql.PreparedStatement; + +import org.junit.Assert; + +import junit.framework.TestCase; + +import com.alibaba.druid.pool.DruidConnectionHolder; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; + +/** + * 这个场景测试initialSize > maxActive + * + * @author wenshao + */ +public class LastActiveTest_0 extends TestCase { + + private DruidDataSource dataSource; + private Field field; + + protected void setUp() throws Exception { + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mock:xxx"); + dataSource.setTestOnBorrow(false); + dataSource.setFilters("stat"); + dataSource.setMinIdle(0); + dataSource.setMaxActive(100); + dataSource.init(); + + field = DruidPooledConnection.class.getDeclaredField("holder"); + field.setAccessible(true); + } + + protected void tearDown() throws Exception { + dataSource.close(); + } + + public void test_0() throws Exception { + + long t0, t1; + { + DruidPooledConnection conn = (DruidPooledConnection) dataSource.getConnection(); + t0 = getLastActiveTime(conn); + PreparedStatement stmt = conn.prepareStatement("select 1"); + Thread.sleep(2); + stmt.execute(); + + stmt.close(); + conn.close(); + } + Thread.sleep(1000); + { + DruidPooledConnection conn = (DruidPooledConnection) dataSource.getConnection(); + t1 = getLastActiveTime(conn); + PreparedStatement stmt = conn.prepareStatement("select 1"); + Thread.sleep(2); + stmt.execute(); + + stmt.close(); + conn.close(); + } + Assert.assertNotEquals(t0, t1); + } + + private long getLastActiveTime(DruidPooledConnection conn) throws IllegalAccessException { + DruidConnectionHolder holder = (DruidConnectionHolder) field.get(conn); + return holder.getLastActiveTimeMillis(); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_7.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_7.java index 7267119f18..a5c1f46f36 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSelectTest_7.java @@ -17,7 +17,7 @@ package com.alibaba.druid.bvt.sql.mysql; import java.util.List; -import junit.framework.Assert; +import org.junit.Assert; import com.alibaba.druid.sql.MysqlTest; import com.alibaba.druid.sql.ast.SQLStatement; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_3.java new file mode 100644 index 0000000000..0b7327a3dc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlUpdateTest_3.java @@ -0,0 +1,68 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlUpdateTest_3 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "update scheme.table set col_1 = 1, col2 = '2' " // + + "where col_3 = 3 and (length(col_4) > 4 or col_5 <> '5')"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("scheme.table"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("scheme.table", "col_1"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("scheme.table", "col2"))); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("UPDATE scheme.table" // + + "\nSET col_1 = 1, col2 = '2'"// + + "\nWHERE col_3 = 3" // + + "\n\tAND (length(col_4) > 4" // + + "\n\t\tOR col_5 <> '5')", // + output); + } +} diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index dde6eef30d..89c8ff07bb 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -30,5 +30,6 @@ log4j.category.org.apache.struts.action.ActionServlet=ERROR log4j.category.com.alibaba.druid.mock=ERROR log4j.category.org.apache.hadoop=WARN log4j.category.org.apache.zookeeper=ERROR +log4j.category.druid.sql=DEBUG log4j.rootLogger=TRACE,CONSOLE