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());
}
}