From 80236a3115364ceb0fa2721b1433c4afbeec1c01 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 29 Nov 2012 17:32:53 +0800 Subject: [PATCH 1/4] improve error info --- .../java/com/alibaba/druid/pool/DruidAbstractDataSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 83fa7cfbfc..1752ca98f3 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -1325,7 +1325,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements conn = createPhysicalConnection(url, physicalConnectProperties); if (conn == null) { - throw new SQLException("connect error, url " + url); + throw new SQLException("connect error, url " + url + ", driverClass " + this.driverClass); } initPhysicalConnection(conn); From 64764c6df4a678e49924b12921daf046fb63a863 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 1 Dec 2012 22:28:58 +0800 Subject: [PATCH 2/4] WallFilter support h2 --- pom.xml | 2 +- src/main/java/com/alibaba/druid/wall/WallFilter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d91a256d8d..48aa1dbdc5 100644 --- a/pom.xml +++ b/pom.xml @@ -506,7 +506,7 @@ com.h2database h2 - 1.3.168 + 1.3.170 provided diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index 590358e148..f55016fc45 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -63,7 +63,7 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { dbType = JdbcUtils.getDbType(dataSource.getUrl(), null); } - if (JdbcUtils.MYSQL.equals(dbType)) { + if (JdbcUtils.MYSQL.equals(dbType) || JdbcUtils.H2.equals(dbType)) { if (config == null) { config = new WallConfig(MySqlWallProvider.DEFAULT_CONFIG_DIR); } From 797f4c8a3c814e695165926e730c553fdbf0b2f0 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 2 Dec 2012 01:04:34 +0800 Subject: [PATCH 3/4] support column primary key & unique index --- .../ast/statement/SQLColumnPrimaryKey.java | 17 +++++++++++++++ .../ast/statement/SQLColumnUniqueIndex.java | 17 +++++++++++++++ .../druid/sql/parser/SQLExprParser.java | 15 +++++++++++++ .../sql/visitor/SQLASTOutputVisitor.java | 20 +++++++++++++++--- .../druid/sql/visitor/SQLASTVisitor.java | 10 +++++++++ .../sql/visitor/SQLASTVisitorAdapter.java | 21 +++++++++++++++++++ 6 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnPrimaryKey.java create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueIndex.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnPrimaryKey.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnPrimaryKey.java new file mode 100644 index 0000000000..4814740746 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnPrimaryKey.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLColumnPrimaryKey extends SQLConstaintImpl implements SQLColumnConstraint { + + private static final long serialVersionUID = 1L; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueIndex.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueIndex.java new file mode 100644 index 0000000000..beaf3ed5cc --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueIndex.java @@ -0,0 +1,17 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLColumnUniqueIndex extends SQLConstaintImpl implements SQLColumnConstraint { + + private static final long serialVersionUID = 1L; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index a97aa522e3..8b9495b952 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -62,6 +62,7 @@ import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; @@ -1232,6 +1233,20 @@ public class SQLExprParser extends SQLParser { column.setDefaultExpr(new SQLNullExpr()); return parseColumnRest(column); } + + if (lexer.token == Token.PRIMARY) { + lexer.nextToken(); + accept(Token.KEY); + column.getConstaints().add(new SQLColumnPrimaryKey()); + return parseColumnRest(column); + } + + if (lexer.token == Token.UNION) { + lexer.nextToken(); + accept(Token.KEY); + column.getConstaints().add(new SQLColumnPrimaryKey()); + return parseColumnRest(column); + } return column; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 48619a6b58..2699ffa30f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -59,12 +59,17 @@ import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueIndex; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLDropIndexStatement; @@ -75,9 +80,6 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; -import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; import com.alibaba.druid.sql.ast.statement.SQLSavePointStatement; @@ -1179,4 +1181,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { } return false; } + + @Override + public boolean visit(SQLColumnPrimaryKey x) { + print(" PRIMARY KEY"); + return false; + } + + @Override + public boolean visit(SQLColumnUniqueIndex x) { + print(" UNIQUE INDEX"); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index fb3881874b..ba59bc9386 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -60,6 +60,8 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueIndex; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; @@ -395,4 +397,12 @@ public interface SQLASTVisitor { void endVisit(SQLOver x); boolean visit(SQLOver x); + + void endVisit(SQLColumnPrimaryKey x); + + boolean visit(SQLColumnPrimaryKey x); + + void endVisit(SQLColumnUniqueIndex x); + + boolean visit(SQLColumnUniqueIndex x); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 374e79de58..6f093e7bb7 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -60,6 +60,8 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueIndex; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; @@ -714,4 +716,23 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public boolean visit(SQLOver x) { return true; } + + @Override + public void endVisit(SQLColumnPrimaryKey x) { + + } + + @Override + public boolean visit(SQLColumnPrimaryKey x) { + return true; + } + + @Override + public void endVisit(SQLColumnUniqueIndex x) { + } + + @Override + public boolean visit(SQLColumnUniqueIndex x) { + return true; + } } From 00341b55071be98ca470dcd92ac55e920095e1a2 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 2 Dec 2012 03:53:56 +0800 Subject: [PATCH 4/4] change performance testcase, add proxool/tomcat-jdbc --- pom.xml | 7 ++ .../alibaba/druid/benckmark/pool/Case0.java | 70 +++++++++++++++- .../alibaba/druid/benckmark/pool/Case1.java | 80 ++++++++++++++++--- 3 files changed, 144 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 48aa1dbdc5..b779f9399e 100644 --- a/pom.xml +++ b/pom.xml @@ -496,6 +496,13 @@ test + + org.apache.tomcat + tomcat-jdbc + 7.0.33 + test + + org.apache.ibatis ibatis-sqlmap diff --git a/src/test/java/com/alibaba/druid/benckmark/pool/Case0.java b/src/test/java/com/alibaba/druid/benckmark/pool/Case0.java index 7ace793354..005ed5b885 100644 --- a/src/test/java/com/alibaba/druid/benckmark/pool/Case0.java +++ b/src/test/java/com/alibaba/druid/benckmark/pool/Case0.java @@ -26,10 +26,12 @@ import javax.sql.DataSource; import junit.framework.TestCase; import org.apache.commons.dbcp.BasicDataSource; +import org.logicalcobwebs.proxool.ProxoolDataSource; import com.alibaba.druid.TestUtil; import com.alibaba.druid.pool.DruidDataSource; import com.jolbox.bonecp.BoneCPDataSource; +import com.mchange.v2.c3p0.ComboPooledDataSource; public class Case0 extends TestCase { @@ -59,7 +61,7 @@ public class Case0 extends TestCase { // password = "dragoon"; } - public void test_0() throws Exception { + public void test_druid() throws Exception { DruidDataSource dataSource = new DruidDataSource(); dataSource.setInitialSize(initialSize); @@ -82,7 +84,7 @@ public class Case0 extends TestCase { System.out.println(); } - public void test_1() throws Exception { + public void f_test_1() throws Exception { final BasicDataSource dataSource = new BasicDataSource(); dataSource.setInitialSize(initialSize); @@ -105,7 +107,7 @@ public class Case0 extends TestCase { System.out.println(); } - public void test_2() throws Exception { + public void f_test_2() throws Exception { BoneCPDataSource dataSource = new BoneCPDataSource(); // dataSource.(10); // dataSource.setMaxActive(50); @@ -126,6 +128,66 @@ public class Case0 extends TestCase { } System.out.println(); } + + public void f_test_c3p0() throws Exception { + ComboPooledDataSource dataSource = new ComboPooledDataSource(); + // dataSource.(10); + // dataSource.setMaxActive(50); + dataSource.setMinPoolSize(minIdle); + dataSource.setMaxPoolSize(maxIdle); + + dataSource.setDriverClass(driverClass); + dataSource.setJdbcUrl(jdbcUrl); + // dataSource.setPoolPreparedStatements(true); + // dataSource.setMaxOpenPreparedStatements(100); + dataSource.setUser(user); + dataSource.setPassword(password); + + for (int i = 0; i < LOOP_COUNT; ++i) { + p0(dataSource, "c3p0"); + } + System.out.println(); + } + + public void f_test_proxool() throws Exception { + ProxoolDataSource dataSource = new ProxoolDataSource(); + // dataSource.(10); + // dataSource.setMaxActive(50); + dataSource.setMinimumConnectionCount(minIdle); + dataSource.setMaximumConnectionCount(maxIdle); + + dataSource.setDriver(driverClass); + dataSource.setDriverUrl(jdbcUrl); + // dataSource.setPoolPreparedStatements(true); + // dataSource.setMaxOpenPreparedStatements(100); + dataSource.setUser(user); + dataSource.setPassword(password); + + for (int i = 0; i < LOOP_COUNT; ++i) { + p0(dataSource, "proxool"); + } + System.out.println(); + } + + public void f_test_tomcat_jdbc() throws Exception { + org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(); + // dataSource.(10); + // dataSource.setMaxActive(50); + dataSource.setMinIdle(minIdle); + dataSource.setMaxActive(maxIdle); + + dataSource.setDriverClassName(driverClass); + dataSource.setUrl(jdbcUrl); + // dataSource.setPoolPreparedStatements(true); + // dataSource.setMaxOpenPreparedStatements(100); + dataSource.setUsername(user); + dataSource.setPassword(password); + + for (int i = 0; i < LOOP_COUNT; ++i) { + p0(dataSource, "tomcat-jdbc"); + } + System.out.println(); + } private void p0(DataSource dataSource, String name) throws SQLException { long startMillis = System.currentTimeMillis(); @@ -134,7 +196,7 @@ public class Case0 extends TestCase { for (int i = 0; i < COUNT; ++i) { Connection conn = dataSource.getConnection(); -// Statement stmt = conn.createStatement(); + Statement stmt = conn.createStatement(); // ResultSet rs = stmt.executeQuery("SELECT 1"); // rs.close(); // stmt.close(); diff --git a/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java b/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java index 47ae7a444a..b34119b814 100644 --- a/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java +++ b/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java @@ -26,10 +26,12 @@ import javax.sql.DataSource; import junit.framework.TestCase; import org.apache.commons.dbcp.BasicDataSource; +import org.logicalcobwebs.proxool.ProxoolDataSource; import com.alibaba.druid.TestUtil; import com.alibaba.druid.pool.DruidDataSource; import com.jolbox.bonecp.BoneCPDataSource; +import com.mchange.v2.c3p0.ComboPooledDataSource; /** * TestOnBo 类Case1.java的实现描述:TODO 类实现描述 @@ -47,19 +49,19 @@ public class Case1 extends TestCase { private int maxPoolSize = 50; private int maxActive = 50; private String validationQuery = "SELECT 1"; - private int threadCount = 5; - private int loopCount = 3; - final int LOOP_COUNT = 1000 * 100; + private int threadCount = 2; + private int loopCount = 5; + final int LOOP_COUNT = 1000 * 500; protected void setUp() throws Exception { - jdbcUrl = "jdbc:fake:dragoon_v25masterdb"; + jdbcUrl = "jdbc:h2:mem:"; user = "dragoon25"; password = "dragoon25"; - driverClass = "com.alibaba.druid.mock.MockDriver"; + driverClass = "org.h2.Driver"; } - public void test_0() throws Exception { - DruidDataSource dataSource = new DruidDataSource(false); + public void test_druid() throws Exception { + DruidDataSource dataSource = new DruidDataSource(); dataSource.setInitialSize(initialSize); dataSource.setMaxActive(maxActive); @@ -80,7 +82,7 @@ public class Case1 extends TestCase { System.out.println(); } - public void test_1() throws Exception { + public void test_dbcp() throws Exception { final BasicDataSource dataSource = new BasicDataSource(); dataSource.setInitialSize(initialSize); @@ -102,7 +104,7 @@ public class Case1 extends TestCase { System.out.println(); } - public void test_2() throws Exception { + public void test_bonecp() throws Exception { BoneCPDataSource dataSource = new BoneCPDataSource(); // dataSource.(10); // dataSource.setMaxActive(50); @@ -127,6 +129,66 @@ public class Case1 extends TestCase { } System.out.println(); } + + public void test_c3p0() throws Exception { + ComboPooledDataSource dataSource = new ComboPooledDataSource(); + // dataSource.(10); + // dataSource.setMaxActive(50); + dataSource.setMinPoolSize(minPoolSize); + dataSource.setMaxPoolSize(maxPoolSize); + + dataSource.setDriverClass(driverClass); + dataSource.setJdbcUrl(jdbcUrl); + // dataSource.setPoolPreparedStatements(true); + // dataSource.setMaxOpenPreparedStatements(100); + dataSource.setUser(user); + dataSource.setPassword(password); + + for (int i = 0; i < loopCount; ++i) { + p0(dataSource, "c3p0", threadCount); + } + System.out.println(); + } + + public void test_proxool() throws Exception { + ProxoolDataSource dataSource = new ProxoolDataSource(); + // dataSource.(10); + // dataSource.setMaxActive(50); + dataSource.setMinimumConnectionCount(minPoolSize); + dataSource.setMaximumConnectionCount(maxPoolSize); + + dataSource.setDriver(driverClass); + dataSource.setDriverUrl(jdbcUrl); + // dataSource.setPoolPreparedStatements(true); + // dataSource.setMaxOpenPreparedStatements(100); + dataSource.setUser(user); + dataSource.setPassword(password); + + for (int i = 0; i < loopCount; ++i) { + p0(dataSource, "proxool", threadCount); + } + System.out.println(); + } + + public void test_tomcat_jdbc() throws Exception { + org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(); + // dataSource.(10); + dataSource.setMaxIdle(maxPoolSize); + dataSource.setMinIdle(minPoolSize); + dataSource.setMaxActive(maxPoolSize); + + dataSource.setDriverClassName(driverClass); + dataSource.setUrl(jdbcUrl); + // dataSource.setPoolPreparedStatements(true); + // dataSource.setMaxOpenPreparedStatements(100); + dataSource.setUsername(user); + dataSource.setPassword(password); + + for (int i = 0; i < loopCount; ++i) { + p0(dataSource, "tomcat-jdbc", threadCount); + } + System.out.println(); + } private void p0(final DataSource dataSource, String name, int threadCount) throws Exception {