From 342b6af58b9daaad2660450893b75174fa57c996 Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 20 Jul 2012 07:44:06 +0800 Subject: [PATCH] refactor & add testcase --- .../druid/pool/DruidAbstractDataSource.java | 4 -- .../alibaba/druid/pool/DruidDataSource.java | 4 +- .../java/com/alibaba/druid/sql/SQLUtils.java | 30 +++++++++++++ .../stat/DruidDataSourceStatManager.java | 8 ++-- .../druid/benckmark/sql/OraclePerfTest.java | 45 +++++++++++++++++++ src/test/resources/benchmark/sql/oracle-0.txt | 0 6 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/benckmark/sql/OraclePerfTest.java create mode 100644 src/test/resources/benchmark/sql/oracle-0.txt diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index bf83234df5..8a2887013f 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -766,10 +766,6 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements return "DataSource-" + System.identityHashCode(this); } - public String getNameInternal() { - return this.name; - } - public void setName(String name) { this.name = name; } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 414c5d97dc..d96de1d7cb 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -30,6 +30,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; +import javax.management.ObjectName; import javax.naming.NamingException; import javax.naming.Reference; import javax.naming.Referenceable; @@ -377,7 +378,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat initedLatch.await(); createdTime = new Date(); - DruidDataSourceStatManager.add(this); + ObjectName objectName = DruidDataSourceStatManager.add(this, this.name); + this.setObjectName(objectName); if (connectError != null && poolingCount == 0) { throw connectError; diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 66e48c48e0..582df1148d 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -7,15 +7,20 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLParserUtils; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.sql.parser.Token; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; import com.alibaba.druid.util.JdbcUtils; public class SQLUtils { @@ -148,6 +153,31 @@ public class SQLUtils { return new SQLASTOutputVisitor(out); } + + public static SchemaStatVisitor createSchemaStatVisitor(Appendable out, List statementList, + String dbType) { + if (JdbcUtils.ORACLE.equals(dbType)) { + if (statementList.size() == 1) { + return new OracleSchemaStatVisitor(); + } else { + return new OracleSchemaStatVisitor(); + } + } + + if (JdbcUtils.MYSQL.equals(dbType)) { + return new MySqlSchemaStatVisitor(); + } + + if (JdbcUtils.POSTGRESQL.equals(dbType)) { + return new PGSchemaStatVisitor(); + } + + if (JdbcUtils.SQL_SERVER.equals(dbType)) { + return new SQLServerSchemaStatVisitor(); + } + + return new SchemaStatVisitor(); + } public static List parseStatements(String sql, String dbType) { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); diff --git a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java index 75f42e7f36..6afea34096 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/DruidDataSourceStatManager.java @@ -55,7 +55,7 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe return instance; } - public synchronized static void add(DruidDataSource dataSource) { + public synchronized static ObjectName add(DruidDataSource dataSource, String name) { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); if (dataSources.size() == 0) { try { @@ -70,9 +70,9 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe } ObjectName objectName = null; - if (dataSource.getNameInternal() != null) { + if (name != null) { try { - objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + dataSource.getNameInternal()); + objectName = new ObjectName("com.alibaba.druid:type=DruidDataSource,id=" + name); mbeanServer.registerMBean(dataSource, objectName); } catch (JMException ex) { LOG.error("register mbean error", ex); @@ -92,7 +92,7 @@ public class DruidDataSourceStatManager implements DruidDataSourceStatManagerMBe } dataSources.put(dataSource, objectName); - dataSource.setObjectName(objectName); + return objectName; } public synchronized static void remove(DruidDataSource dataSource) { diff --git a/src/test/java/com/alibaba/druid/benckmark/sql/OraclePerfTest.java b/src/test/java/com/alibaba/druid/benckmark/sql/OraclePerfTest.java new file mode 100644 index 0000000000..bb74436662 --- /dev/null +++ b/src/test/java/com/alibaba/druid/benckmark/sql/OraclePerfTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.benckmark.sql; + +import java.util.List; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; + +public class OraclePerfTest extends TestCase { + private String sql; + + protected void setUp() throws Exception { + sql = "SELECT * FROM T"; + } + + public void test_pert() throws Exception { + for (int i = 0; i < 10; ++i) { + perfMySql(sql); + } + } + + long perfMySql(String sql) { + long startMillis = System.currentTimeMillis(); + for (int i = 0; i < 1000 * 1000; ++i) { + execMySql(sql); + } + long millis = System.currentTimeMillis() - startMillis; + System.out.println("MySql\t" + millis); + return millis; + } + + private String execMySql(String sql) { + StringBuilder out = new StringBuilder(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(out); + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + for (SQLStatement statement : statementList) { + statement.accept(visitor); + visitor.println(); + } + return out.toString(); + } +} diff --git a/src/test/resources/benchmark/sql/oracle-0.txt b/src/test/resources/benchmark/sql/oracle-0.txt new file mode 100644 index 0000000000..e69de29bb2