diff --git a/pom.xml b/pom.xml index 34712324af..678f10eac5 100644 --- a/pom.xml +++ b/pom.xml @@ -522,12 +522,6 @@ hibernate-core 4.1.8.Final provided - - - org.jboss.logging - jboss-logging - - 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 3461b5cd2f..e2fbb7ec55 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java @@ -86,7 +86,11 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr @Override public boolean execute() throws SQLException { updateCount = null; + lastExecuteSql = sql; lastExecuteType = StatementExecuteType.Execute; + lastExecuteStartNano = -1L; + lastExecuteTimeNano = -1L; + firstResultSet = createChain().preparedStatement_execute(this); return firstResultSet; } @@ -94,15 +98,26 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr @Override public ResultSet executeQuery() throws SQLException { firstResultSet = true; + updateCount = null; + lastExecuteSql = sql; lastExecuteType = StatementExecuteType.ExecuteQuery; + lastExecuteStartNano = -1L; + lastExecuteTimeNano = -1L; + return createChain().preparedStatement_executeQuery(this); } @Override public int executeUpdate() throws SQLException { firstResultSet = false; + + updateCount = null; + lastExecuteSql = sql; lastExecuteType = StatementExecuteType.ExecuteUpdate; + lastExecuteStartNano = -1L; + lastExecuteTimeNano = -1L; + 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 d97c2d8aa6..9be747d2fa 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/StatementProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/StatementProxyImpl.java @@ -39,8 +39,8 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro private final Statement statement; protected String lastExecuteSql; - private long lastExecuteStartNano; - private long lastExecuteTimeNano; + protected long lastExecuteStartNano; + protected long lastExecuteTimeNano; protected JdbcSqlStat sqlStat; protected boolean firstResultSet; @@ -111,7 +111,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.Execute; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + firstResultSet = createChain().statement_execute(this, sql); return firstResultSet; } @@ -123,7 +123,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.Execute; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + firstResultSet = createChain().statement_execute(this, sql, autoGeneratedKeys); return firstResultSet; } @@ -135,7 +135,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.Execute; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + firstResultSet = createChain().statement_execute(this, sql, columnIndexes); return firstResultSet; } @@ -147,7 +147,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.Execute; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + firstResultSet = createChain().statement_execute(this, sql, columnNames); return firstResultSet; } @@ -158,7 +158,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.ExecuteBatch; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + int[] updateCounts = createChain().statement_executeBatch(this); if (updateCounts != null && updateCounts.length == 1) { @@ -176,7 +176,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.ExecuteQuery; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + return createChain().statement_executeQuery(this, sql); } @@ -187,7 +187,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.ExecuteUpdate; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + updateCount = createChain().statement_executeUpdate(this, sql); return updateCount; } @@ -199,7 +199,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.ExecuteUpdate; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + updateCount = createChain().statement_executeUpdate(this, sql, autoGeneratedKeys); return updateCount; } @@ -211,7 +211,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.ExecuteUpdate; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + updateCount = createChain().statement_executeUpdate(this, sql, columnIndexes); return updateCount; } @@ -223,7 +223,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro lastExecuteType = StatementExecuteType.ExecuteUpdate; lastExecuteStartNano = -1L; lastExecuteTimeNano = -1L; - + updateCount = createChain().statement_executeUpdate(this, sql, columnNames); return updateCount; } @@ -422,7 +422,7 @@ public class StatementProxyImpl extends WrapperProxyImpl implements StatementPro public void setLastExecuteTimeNano(long lastExecuteTimeNano) { this.lastExecuteTimeNano = lastExecuteTimeNano; } - + public void setLastExecuteTimeNano() { if (this.lastExecuteTimeNano <= 0 && this.lastExecuteStartNano > 0) { this.lastExecuteTimeNano = System.nanoTime() - this.lastExecuteStartNano; diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java index 0886ac9f9d..47cbf44207 100644 --- a/src/main/java/com/alibaba/druid/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java @@ -24,353 +24,363 @@ import com.alibaba.druid.wall.spi.WallVisitorUtils; public class WallConfig implements WallConfigMBean { - private boolean noneBaseStatementAllow = false; + private boolean noneBaseStatementAllow = false; - private boolean callAllow = true; - private boolean selelctAllow = true; - private boolean selectIntoAllow = true; - private boolean selectIntoOutfileAllow = false; - private boolean selectWhereAlwayTrueCheck = true; - private boolean selectHavingAlwayTrueCheck = true; - private boolean selectUnionCheck = true; + private boolean callAllow = true; + private boolean selelctAllow = true; + private boolean selectIntoAllow = true; + private boolean selectIntoOutfileAllow = false; + private boolean selectWhereAlwayTrueCheck = true; + private boolean selectHavingAlwayTrueCheck = true; + private boolean selectUnionCheck = true; - private boolean deleteAllow = true; - private boolean deleteWhereAlwayTrueCheck = true; + private boolean deleteAllow = true; + private boolean deleteWhereAlwayTrueCheck = true; - private boolean updateAllow = true; - private boolean updateWhereAlayTrueCheck = true; + private boolean updateAllow = true; + private boolean updateWhereAlayTrueCheck = true; - private boolean insertAllow = true; - private boolean mergeAllow = true; + private boolean insertAllow = true; + private boolean mergeAllow = true; - private boolean multiStatementAllow = false; + private boolean multiStatementAllow = false; - private boolean truncateAllow = false; + private boolean truncateAllow = false; - private boolean commentAllow = false; + private boolean commentAllow = false; - private boolean schemaCheck = true; - private boolean tableCheck = true; - private boolean functionCheck = true; - private boolean objectCheck = true; - private boolean variantCheck = true; + private boolean schemaCheck = true; + private boolean tableCheck = true; + private boolean functionCheck = true; + private boolean objectCheck = true; + private boolean variantCheck = true; - private boolean mustParameterized = false; + private boolean mustParameterized = false; - private boolean allowDoPrivileged = false; + private boolean allowDoPrivileged = false; - protected final Set permitFunctions = new HashSet(); - protected final Set permitTables = new HashSet(); - protected final Set permitSchemas = new HashSet(); - protected final Set permitVariants = new HashSet(); - protected final Set permitObjects = new HashSet(); + protected final Set permitFunctions = new HashSet(); + protected final Set permitTables = new HashSet(); + protected final Set permitSchemas = new HashSet(); + protected final Set permitVariants = new HashSet(); + protected final Set permitObjects = new HashSet(); - protected final Set readOnlyTables = new HashSet(); + protected final Set readOnlyTables = new HashSet(); - private String dir; + private String dir; - private boolean inited; + private boolean inited; - private String tenantTablePattern; - private String tenantColumn; + private String tenantTablePattern; + private String tenantColumn; - public WallConfig() { + private boolean wrapAllow = false; - } + public WallConfig(){ - public String getTenantTablePattern() { - return tenantTablePattern; - } + } - public void setTenantTablePattern(String tenantTablePattern) { - this.tenantTablePattern = tenantTablePattern; - } + public String getTenantTablePattern() { + return tenantTablePattern; + } - public String getTenantColumn() { - return tenantColumn; - } + public void setTenantTablePattern(String tenantTablePattern) { + this.tenantTablePattern = tenantTablePattern; + } - public void setTenantColumn(String tenantColumn) { - this.tenantColumn = tenantColumn; - } + public String getTenantColumn() { + return tenantColumn; + } - public boolean isAllowDoPrivileged() { - return allowDoPrivileged; - } + public void setTenantColumn(String tenantColumn) { + this.tenantColumn = tenantColumn; + } - public void setAllowDoPrivileged(boolean allowDoPrivileged) { - this.allowDoPrivileged = allowDoPrivileged; - } + public boolean isWrapAllow() { + return wrapAllow; + } - public boolean isInited() { - return inited; - } + public void setWrapAllow(boolean wrapAllow) { + this.wrapAllow = wrapAllow; + } - public WallConfig(String dir) { - this.dir = dir; - this.init(); - } + public boolean isAllowDoPrivileged() { + return allowDoPrivileged; + } - public String getDir() { - return dir; - } + public void setAllowDoPrivileged(boolean allowDoPrivileged) { + this.allowDoPrivileged = allowDoPrivileged; + } - public void setDir(String dir) { - this.dir = dir; - } + public boolean isInited() { + return inited; + } - public final void init() { - loadConfig(dir); - } + public WallConfig(String dir){ + this.dir = dir; + this.init(); + } - public void loadConfig(String dir) { - if (dir.endsWith("/")) { - dir = dir.substring(0, dir.length() - 1); - } + public String getDir() { + return dir; + } - loadResource(this.permitVariants, dir + "/permit-variant.txt"); - loadResource(this.permitSchemas, dir + "/permit-schema.txt"); - loadResource(this.permitFunctions, dir + "/permit-function.txt"); - loadResource(this.permitTables, dir + "/permit-table.txt"); - loadResource(this.permitObjects, dir + "/permit-object.txt"); - loadResource(this.readOnlyTables, dir + "/readonly-table.txt"); - } + public void setDir(String dir) { + this.dir = dir; + } - public boolean isNoneBaseStatementAllow() { - return noneBaseStatementAllow; - } + public final void init() { + loadConfig(dir); + } - public void setNoneBaseStatementAllow(boolean noneBaseStatementAllow) { - this.noneBaseStatementAllow = noneBaseStatementAllow; - } + public void loadConfig(String dir) { + if (dir.endsWith("/")) { + dir = dir.substring(0, dir.length() - 1); + } - public boolean isTruncateAllow() { - return truncateAllow; - } + loadResource(this.permitVariants, dir + "/permit-variant.txt"); + loadResource(this.permitSchemas, dir + "/permit-schema.txt"); + loadResource(this.permitFunctions, dir + "/permit-function.txt"); + loadResource(this.permitTables, dir + "/permit-table.txt"); + loadResource(this.permitObjects, dir + "/permit-object.txt"); + loadResource(this.readOnlyTables, dir + "/readonly-table.txt"); + } - public void setTruncateAllow(boolean truncateAllow) { - this.truncateAllow = truncateAllow; - } + public boolean isNoneBaseStatementAllow() { + return noneBaseStatementAllow; + } - public boolean isSelelctAllow() { - return selelctAllow; - } + public void setNoneBaseStatementAllow(boolean noneBaseStatementAllow) { + this.noneBaseStatementAllow = noneBaseStatementAllow; + } - public void setSelelctAllow(boolean selelctAllow) { - this.selelctAllow = selelctAllow; - } + public boolean isTruncateAllow() { + return truncateAllow; + } - public boolean isSelectIntoAllow() { - return selectIntoAllow; - } + public void setTruncateAllow(boolean truncateAllow) { + this.truncateAllow = truncateAllow; + } - public void setSelectIntoAllow(boolean selectIntoAllow) { - this.selectIntoAllow = selectIntoAllow; - } + public boolean isSelelctAllow() { + return selelctAllow; + } - public boolean isSelectIntoOutfileAllow() { - return selectIntoOutfileAllow; - } + public void setSelelctAllow(boolean selelctAllow) { + this.selelctAllow = selelctAllow; + } - public void setSelectIntoOutfileAllow(boolean selectIntoOutfileAllow) { - this.selectIntoOutfileAllow = selectIntoOutfileAllow; - } + public boolean isSelectIntoAllow() { + return selectIntoAllow; + } - public boolean isSelectUnionCheck() { - return selectUnionCheck; - } - - public void setSelectUnionCheck(boolean selectUnionCheck) { - this.selectUnionCheck = selectUnionCheck; - } - - public boolean isSelectWhereAlwayTrueCheck() { - return selectWhereAlwayTrueCheck; - } - - public void setSelectWhereAlwayTrueCheck(boolean selectWhereAlwayTrueCheck) { - this.selectWhereAlwayTrueCheck = selectWhereAlwayTrueCheck; - } - - public boolean isSelectHavingAlwayTrueCheck() { - return selectHavingAlwayTrueCheck; - } - - public void setSelectHavingAlwayTrueCheck(boolean selectHavingAlwayTrueCheck) { - this.selectHavingAlwayTrueCheck = selectHavingAlwayTrueCheck; - } - - public boolean isDeleteAllow() { - return deleteAllow; - } - - public void setDeleteAllow(boolean deleteAllow) { - this.deleteAllow = deleteAllow; - } - - public boolean isDeleteWhereAlwayTrueCheck() { - return deleteWhereAlwayTrueCheck; - } - - public void setDeleteWhereAlwayTrueCheck(boolean deleteWhereAlwayTrueCheck) { - this.deleteWhereAlwayTrueCheck = deleteWhereAlwayTrueCheck; - } - - public boolean isUpdateAllow() { - return updateAllow; - } - - public void setUpdateAllow(boolean updateAllow) { - this.updateAllow = updateAllow; - } - - public boolean isUpdateWhereAlayTrueCheck() { - return updateWhereAlayTrueCheck; - } + public void setSelectIntoAllow(boolean selectIntoAllow) { + this.selectIntoAllow = selectIntoAllow; + } - public void setUpdateWhereAlayTrueCheck(boolean updateWhereAlayTrueCheck) { - this.updateWhereAlayTrueCheck = updateWhereAlayTrueCheck; - } + public boolean isSelectIntoOutfileAllow() { + return selectIntoOutfileAllow; + } + + public void setSelectIntoOutfileAllow(boolean selectIntoOutfileAllow) { + this.selectIntoOutfileAllow = selectIntoOutfileAllow; + } + + public boolean isSelectUnionCheck() { + return selectUnionCheck; + } + + public void setSelectUnionCheck(boolean selectUnionCheck) { + this.selectUnionCheck = selectUnionCheck; + } + + public boolean isSelectWhereAlwayTrueCheck() { + return selectWhereAlwayTrueCheck; + } + + public void setSelectWhereAlwayTrueCheck(boolean selectWhereAlwayTrueCheck) { + this.selectWhereAlwayTrueCheck = selectWhereAlwayTrueCheck; + } + + public boolean isSelectHavingAlwayTrueCheck() { + return selectHavingAlwayTrueCheck; + } + + public void setSelectHavingAlwayTrueCheck(boolean selectHavingAlwayTrueCheck) { + this.selectHavingAlwayTrueCheck = selectHavingAlwayTrueCheck; + } + + public boolean isDeleteAllow() { + return deleteAllow; + } + + public void setDeleteAllow(boolean deleteAllow) { + this.deleteAllow = deleteAllow; + } + + public boolean isDeleteWhereAlwayTrueCheck() { + return deleteWhereAlwayTrueCheck; + } + + public void setDeleteWhereAlwayTrueCheck(boolean deleteWhereAlwayTrueCheck) { + this.deleteWhereAlwayTrueCheck = deleteWhereAlwayTrueCheck; + } + + public boolean isUpdateAllow() { + return updateAllow; + } + + public void setUpdateAllow(boolean updateAllow) { + this.updateAllow = updateAllow; + } + + public boolean isUpdateWhereAlayTrueCheck() { + return updateWhereAlayTrueCheck; + } - public boolean isInsertAllow() { - return insertAllow; - } + public void setUpdateWhereAlayTrueCheck(boolean updateWhereAlayTrueCheck) { + this.updateWhereAlayTrueCheck = updateWhereAlayTrueCheck; + } - public void setInsertAllow(boolean insertAllow) { - this.insertAllow = insertAllow; - } + public boolean isInsertAllow() { + return insertAllow; + } - public boolean isMergeAllow() { - return mergeAllow; - } + public void setInsertAllow(boolean insertAllow) { + this.insertAllow = insertAllow; + } - public void setMergeAllow(boolean mergeAllow) { - this.mergeAllow = mergeAllow; - } + public boolean isMergeAllow() { + return mergeAllow; + } - public boolean isMultiStatementAllow() { - return multiStatementAllow; - } + public void setMergeAllow(boolean mergeAllow) { + this.mergeAllow = mergeAllow; + } - public void setMultiStatementAllow(boolean multiStatementAllow) { - this.multiStatementAllow = multiStatementAllow; - } + public boolean isMultiStatementAllow() { + return multiStatementAllow; + } - public boolean isSchemaCheck() { - return schemaCheck; - } + public void setMultiStatementAllow(boolean multiStatementAllow) { + this.multiStatementAllow = multiStatementAllow; + } - public void setSchemaCheck(boolean schemaCheck) { - this.schemaCheck = schemaCheck; - } + public boolean isSchemaCheck() { + return schemaCheck; + } - public boolean isTableCheck() { - return tableCheck; - } + public void setSchemaCheck(boolean schemaCheck) { + this.schemaCheck = schemaCheck; + } - public void setTableCheck(boolean tableCheck) { - this.tableCheck = tableCheck; - } + public boolean isTableCheck() { + return tableCheck; + } - public boolean isFunctionCheck() { - return functionCheck; - } + public void setTableCheck(boolean tableCheck) { + this.tableCheck = tableCheck; + } - public void setFunctionCheck(boolean functionCheck) { - this.functionCheck = functionCheck; - } + public boolean isFunctionCheck() { + return functionCheck; + } - public boolean isVariantCheck() { - return variantCheck; - } + public void setFunctionCheck(boolean functionCheck) { + this.functionCheck = functionCheck; + } - public void setVariantCheck(boolean variantCheck) { - this.variantCheck = variantCheck; - } + public boolean isVariantCheck() { + return variantCheck; + } - public boolean isObjectCheck() { - return objectCheck; - } + public void setVariantCheck(boolean variantCheck) { + this.variantCheck = variantCheck; + } - public void setObjectCheck(boolean objectCheck) { - this.objectCheck = objectCheck; - } + public boolean isObjectCheck() { + return objectCheck; + } - // /////////////////// + public void setObjectCheck(boolean objectCheck) { + this.objectCheck = objectCheck; + } - public boolean isCommentAllow() { - return commentAllow; - } + // /////////////////// - public void setCommentAllow(boolean commentAllow) { - this.commentAllow = commentAllow; - } + public boolean isCommentAllow() { + return commentAllow; + } - public Set getPermitFunctions() { - return permitFunctions; - } + public void setCommentAllow(boolean commentAllow) { + this.commentAllow = commentAllow; + } - public Set getPermitTables() { - return permitTables; - } + public Set getPermitFunctions() { + return permitFunctions; + } - public Set getPermitSchemas() { - return permitSchemas; - } + public Set getPermitTables() { + return permitTables; + } - public Set getPermitVariants() { - return permitVariants; - } + public Set getPermitSchemas() { + return permitSchemas; + } - public Set getPermitObjects() { - return permitObjects; - } + public Set getPermitVariants() { + return permitVariants; + } - public Set getReadOnlyTables() { - return readOnlyTables; - } + public Set getPermitObjects() { + return permitObjects; + } - public boolean isMustParameterized() { - return mustParameterized; - } + public Set getReadOnlyTables() { + return readOnlyTables; + } - public void setMustParameterized(boolean mustParameterized) { - this.mustParameterized = mustParameterized; - } + public boolean isMustParameterized() { + return mustParameterized; + } - public boolean isPermitObjects(String name) { - if (!objectCheck) { - return false; - } + public void setMustParameterized(boolean mustParameterized) { + this.mustParameterized = mustParameterized; + } - name = WallVisitorUtils.form(name); - return permitObjects.contains(name); - } + public boolean isPermitObjects(String name) { + if (!objectCheck) { + return false; + } - public boolean isPermitSchema(String name) { - if (!schemaCheck) { - return false; - } + name = WallVisitorUtils.form(name); + return permitObjects.contains(name); + } - name = WallVisitorUtils.form(name); - return this.permitSchemas.contains(name); - } + public boolean isPermitSchema(String name) { + if (!schemaCheck) { + return false; + } - public boolean isPermitFunction(String name) { - if (!functionCheck) { - return false; - } - - name = WallVisitorUtils.form(name); - return this.permitFunctions.contains(name); - } - - public boolean isCallAllow() { - return callAllow; - } - - public void setCallAllow(boolean callAllow) { - this.callAllow = callAllow; - } + name = WallVisitorUtils.form(name); + return this.permitSchemas.contains(name); + } + + public boolean isPermitFunction(String name) { + if (!functionCheck) { + return false; + } + + name = WallVisitorUtils.form(name); + return this.permitFunctions.contains(name); + } + + public boolean isCallAllow() { + return callAllow; + } + + public void setCallAllow(boolean callAllow) { + this.callAllow = callAllow; + } } diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index 8629e834ef..a5512f8f30 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -16,6 +16,7 @@ package com.alibaba.druid.wall; import java.sql.SQLException; +import java.sql.Wrapper; import java.util.Collections; import java.util.List; import java.util.Set; @@ -309,5 +310,20 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { return sql; } + + @Override + public boolean isWrapperFor(FilterChain chain, Wrapper wrapper, Class iface) throws SQLException { + if (!this.provider.getConfig().isWrapAllow()) { + return false; + } + return chain.isWrapperFor(wrapper, iface); + } + @Override + public T unwrap(FilterChain chain, Wrapper wrapper, Class iface) throws SQLException { + if (!this.provider.getConfig().isWrapAllow()) { + return null; + } + return chain.unwrap(wrapper, iface); + } } 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 db773c1c14..78e3aa1926 100644 --- a/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java +++ b/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java @@ -18,8 +18,12 @@ package com.alibaba.druid.benckmark.pool; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; import java.text.NumberFormat; +import java.util.Properties; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicLong; import javax.sql.DataSource; @@ -29,6 +33,7 @@ import org.apache.commons.dbcp.BasicDataSource; import org.logicalcobwebs.proxool.ProxoolDataSource; import com.alibaba.druid.TestUtil; +import com.alibaba.druid.mock.MockDriver; import com.alibaba.druid.pool.DruidDataSource; import com.jolbox.bonecp.BoneCPDataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; @@ -43,26 +48,52 @@ import com.taobao.datasource.resource.adapter.jdbc.local.LocalTxDataSource; */ public class Case1 extends TestCase { - private String jdbcUrl; - private String user; - private String password; - private String driverClass; - private int initialSize = 10; - private int minPoolSize = 10; - private int maxPoolSize = 50; - private int maxActive = 50; - private String validationQuery = "SELECT 1"; - private int threadCount = 1; - private int loopCount = 10; - final int LOOP_COUNT = 1000 * 1000 * 1 / threadCount; + private String jdbcUrl; + private String user; + private String password; + private String driverClass; + private int initialSize = 10; + private int minPoolSize = 10; + private int maxPoolSize = 50; + private int maxActive = 50; + private String validationQuery = "SELECT 1"; + private int threadCount = 5; + private int loopCount = 10; + final int LOOP_COUNT = 1000 * 1000 * 1 / threadCount; + + private static AtomicLong physicalConnStat = new AtomicLong(); + + public static class TestDriver extends MockDriver { + + public static TestDriver instance = new TestDriver(); + + public boolean acceptsURL(String url) throws SQLException { + if (url.startsWith("jdbc:test:")) { + return true; + } + return super.acceptsURL(url); + } + + public Connection connect(String url, Properties info) throws SQLException { + physicalConnStat.incrementAndGet(); + return super.connect("jdbc:mock:case1", info); + } + } protected void setUp() throws Exception { - jdbcUrl = "jdbc:h2:mem:"; + DriverManager.registerDriver(TestDriver.instance); + user = "dragoon25"; password = "dragoon25"; - driverClass = "org.h2.Driver"; + + // jdbcUrl = "jdbc:h2:mem:"; + // driverClass = "org.h2.Driver"; + jdbcUrl = "jdbc:test:case1:"; + driverClass = "com.alibaba.druid.benckmark.pool.Case1$TestDriver"; + + physicalConnStat.set(0); } - + public void test_druid() throws Exception { DruidDataSource dataSource = new DruidDataSource(); @@ -84,21 +115,21 @@ public class Case1 extends TestCase { } System.out.println(); } - + public void test_jobss() throws Exception { - LocalTxDataSourceDO dataSourceDO = new LocalTxDataSourceDO(); - dataSourceDO.setBlockingTimeoutMillis(1000 * 60); - dataSourceDO.setMaxPoolSize(maxPoolSize); - dataSourceDO.setMinPoolSize(minPoolSize); - - dataSourceDO.setDriverClass(driverClass); - dataSourceDO.setConnectionURL(jdbcUrl); - dataSourceDO.setUserName(user); - dataSourceDO.setPassword(password); - + LocalTxDataSourceDO dataSourceDO = new LocalTxDataSourceDO(); + dataSourceDO.setBlockingTimeoutMillis(1000 * 60); + dataSourceDO.setMaxPoolSize(maxPoolSize); + dataSourceDO.setMinPoolSize(minPoolSize); + + dataSourceDO.setDriverClass(driverClass); + dataSourceDO.setConnectionURL(jdbcUrl); + dataSourceDO.setUserName(user); + dataSourceDO.setPassword(password); + LocalTxDataSource tx = TaobaoDataSourceFactory.createLocalTxDataSource(dataSourceDO); DataSource dataSource = tx.getDatasource(); - + for (int i = 0; i < loopCount; ++i) { p0(dataSource, "jboss-datasource", threadCount); } @@ -152,7 +183,7 @@ public class Case1 extends TestCase { } System.out.println(); } - + public void test_c3p0() throws Exception { ComboPooledDataSource dataSource = new ComboPooledDataSource(); // dataSource.(10); @@ -172,7 +203,7 @@ public class Case1 extends TestCase { } System.out.println(); } - + public void test_proxool() throws Exception { ProxoolDataSource dataSource = new ProxoolDataSource(); // dataSource.(10); @@ -192,21 +223,21 @@ public class Case1 extends TestCase { } 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.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); } @@ -274,8 +305,10 @@ public class Case1 extends TestCase { System.out.println("thread " + threadCount + " " + name + " millis : " + NumberFormat.getInstance().format(millis) + "; YGC " + ygc + " FGC " + fullGC - + " blocked " + NumberFormat.getInstance().format(blockedCount) // - + " waited " + NumberFormat.getInstance().format(waitedCount)); + + " blocked " + + NumberFormat.getInstance().format(blockedCount) // + + " waited " + NumberFormat.getInstance().format(waitedCount) + " physicalConn " + + physicalConnStat.get()); } } diff --git a/src/test/java/com/alibaba/druid/benckmark/pool/Case2.java b/src/test/java/com/alibaba/druid/benckmark/pool/Case2.java index 07f593e512..5ed8fe243c 100644 --- a/src/test/java/com/alibaba/druid/benckmark/pool/Case2.java +++ b/src/test/java/com/alibaba/druid/benckmark/pool/Case2.java @@ -15,9 +15,12 @@ */ package com.alibaba.druid.benckmark.pool; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; import java.sql.Connection; import java.text.NumberFormat; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicLong; import javax.sql.DataSource; @@ -47,7 +50,7 @@ public class Case2 extends TestCase { private String validationQuery = "SELECT 1"; private int threadCount = 100; private int executeCount = 4; - final int LOOP_COUNT = (1000 * 1000) / executeCount; + final int LOOP_COUNT = (1000 * 100) / executeCount; private boolean testOnBorrow = true; protected void setUp() throws Exception { @@ -131,6 +134,9 @@ public class Case2 extends TestCase { final CountDownLatch startLatch = new CountDownLatch(1); final CountDownLatch endLatch = new CountDownLatch(threadCount); + final AtomicLong blockedStat = new AtomicLong(); + final AtomicLong waitedStat = new AtomicLong(); + for (int i = 0; i < threadCount; ++i) { Thread thread = new Thread() { @@ -138,10 +144,25 @@ public class Case2 extends TestCase { try { startLatch.await(); + long threadId = Thread.currentThread().getId(); + + long startBlockedCount, startWaitedCount; + { + ThreadInfo threadInfo = ManagementFactory.getThreadMXBean().getThreadInfo(threadId); + startBlockedCount = threadInfo.getBlockedCount(); + startWaitedCount = threadInfo.getWaitedCount(); + } for (int i = 0; i < LOOP_COUNT; ++i) { Connection conn = dataSource.getConnection(); conn.close(); } + + ThreadInfo threadInfo = ManagementFactory.getThreadMXBean().getThreadInfo(threadId); + long blockedCount = threadInfo.getBlockedCount() - startBlockedCount; + long waitedCount = threadInfo.getWaitedCount() - startWaitedCount; + + blockedStat.addAndGet(blockedCount); + waitedStat.addAndGet(waitedCount); } catch (Exception ex) { ex.printStackTrace(); } @@ -161,6 +182,7 @@ public class Case2 extends TestCase { long fullGC = TestUtil.getFullGC() - startFullGC; System.out.println("thread " + threadCount + " " + name + " millis : " - + NumberFormat.getInstance().format(millis) + ", YGC " + ygc + " FGC " + fullGC); + + NumberFormat.getInstance().format(millis) + ", YGC " + ygc + " FGC " + fullGC + + " blockedCount " + blockedStat.get() + " waitedCount " + waitedStat.get()); } }