From 533899e3677849faf03443479496ea335939acbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Tue, 20 Mar 2012 04:22:43 +0800 Subject: [PATCH] add jmx support --- .../com/alibaba/druid/wall/WallFilter.java | 28 ++++++++++++++++--- .../alibaba/druid/wall/WallFilterMBean.java | 18 ++++++++++++ .../com/alibaba/druid/wall/WallProvider.java | 16 +++++++++++ .../benckmark/wall/WallBenchmarkTest.java | 4 +-- 4 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/wall/WallFilterMBean.java diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index f9bb84f9a1..aa52047d31 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -1,8 +1,10 @@ package com.alibaba.druid.wall; import java.sql.SQLException; +import java.util.Collections; import java.util.List; import java.util.Properties; +import java.util.Set; import com.alibaba.druid.DruidRuntimeException; import com.alibaba.druid.filter.FilterAdapter; @@ -20,7 +22,7 @@ import com.alibaba.druid.wall.spi.MySqlWallProvider; import com.alibaba.druid.wall.spi.OracleWallProvider; import com.alibaba.druid.wall.spi.SQLServerProvider; -public class WallFilter extends FilterAdapter { +public class WallFilter extends FilterAdapter implements WallFilterMBean { private final static Log LOG = LogFactory.getLog(WallFilter.class); @@ -32,8 +34,8 @@ public class WallFilter extends FilterAdapter { private WallConfig config; - private boolean logViolation = false; - private boolean throwException = true; + private volatile boolean logViolation = false; + private volatile boolean throwException = true; @Override public void init(DataSourceProxy dataSource) { @@ -59,7 +61,7 @@ public class WallFilter extends FilterAdapter { } } else if (JdbcUtils.SQL_SERVER.equals(dbType)) { provider = new SQLServerProvider(config); - + if (config == null) { config = new WallConfig(SQLServerProvider.DEFAULT_CONFIG_DIR); } @@ -94,6 +96,20 @@ public class WallFilter extends FilterAdapter { this.throwException = throwException; } + public void clearProviderCache() { + if (provider != null) { + provider.clearCache(); + } + } + + public Set getProviderWhiteList() { + if (provider == null) { + return Collections.emptySet(); + } + + return provider.getWhiteList(); + } + public WallProvider getProvider() { return provider; } @@ -106,6 +122,10 @@ public class WallFilter extends FilterAdapter { this.config = config; } + public boolean isInited() { + return inited; + } + public void checkInit() { if (inited) { throw new DruidRuntimeException("wall filter is inited"); diff --git a/src/main/java/com/alibaba/druid/wall/WallFilterMBean.java b/src/main/java/com/alibaba/druid/wall/WallFilterMBean.java new file mode 100644 index 0000000000..4f554cc6c7 --- /dev/null +++ b/src/main/java/com/alibaba/druid/wall/WallFilterMBean.java @@ -0,0 +1,18 @@ +package com.alibaba.druid.wall; + +public interface WallFilterMBean { + + String getDbType(); + + boolean isLogViolation(); + + void setLogViolation(boolean logViolation); + + boolean isThrowException(); + + void setThrowException(boolean throwException); + + boolean isInited(); + + void clearProviderCache(); +} diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index b4a1b68374..b99f34ad51 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -2,8 +2,10 @@ package com.alibaba.druid.wall; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Set; import java.util.concurrent.locks.ReentrantReadWriteLock; import com.alibaba.druid.sql.ast.SQLStatement; @@ -47,6 +49,20 @@ public abstract class WallProvider { } } + public Set getWhiteList() { + Set hashSet = new HashSet(); + lock.readLock().lock(); + try { + if (whiteList != null) { + hashSet.addAll(whiteList.keySet()); + } + } finally { + lock.readLock().unlock(); + } + + return hashSet; + } + public void clearCache() { lock.writeLock().lock(); try { diff --git a/src/test/java/com/alibaba/druid/benckmark/wall/WallBenchmarkTest.java b/src/test/java/com/alibaba/druid/benckmark/wall/WallBenchmarkTest.java index a25ea32b8d..6d0ce5f577 100644 --- a/src/test/java/com/alibaba/druid/benckmark/wall/WallBenchmarkTest.java +++ b/src/test/java/com/alibaba/druid/benckmark/wall/WallBenchmarkTest.java @@ -8,7 +8,7 @@ public class WallBenchmarkTest extends TestCase { MySqlWallProvider provider = new MySqlWallProvider(); - public final static int COUNT = 1000 * 1; + public final static int COUNT = 1000 * 1000; public void test_0() throws Exception { String sql = "select * from t"; @@ -23,7 +23,7 @@ public class WallBenchmarkTest extends TestCase { public void perf(String sql) { for (int i = 0; i < COUNT; ++i) { - provider.check(sql + " WHERE FID = " + i); + provider.check(sql); } } }