From b1ea268f43302505ee055a770dda4e7fff26c905 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 15 Jun 2013 00:55:36 +0800 Subject: [PATCH] improve filter's config --- .../druid/pool/DruidAbstractDataSource.java | 20 ++++++++--- .../alibaba/druid/pool/DruidDataSource.java | 33 +++++++++++++++++-- .../druid/pool/DruidDataSourceMBean.java | 1 + .../druid/stat/JdbcDataSourceStat.java | 23 ++++++++++++- .../druid/bvt/filter/ClearFilterTest.java | 15 +++++++++ .../pool/TimeBetweenLogStatsMillisTest.java | 11 +++++++ 6 files changed, 96 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 847a54f009..6155f1aebe 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -135,6 +135,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements System.out); protected List filters = new CopyOnWriteArrayList(); + private boolean clearFiltersEnable = true; protected volatile ExceptionSorter exceptionSorter = null; protected Driver driver; @@ -254,7 +255,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements public DruidDataSourceStatLogger getStatLogger() { return statLogger; } - + public void setStatLoggerClassName(String className) { Class clazz; try { @@ -1164,7 +1165,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } this.addFilters(filters); } - + public void addFilters(String filters) throws SQLException { if (filters == null || filters.length() == 0) { return; @@ -1174,10 +1175,13 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements for (String item : filterArray) { FilterManager.loadFilter(this.filters, item); - } + } } - + public void clearFilters() { + if (!isClearFiltersEnable()) { + return; + } this.filters.clear(); } @@ -1295,6 +1299,14 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements return driver; } + public boolean isClearFiltersEnable() { + return clearFiltersEnable; + } + + public void setClearFiltersEnable(boolean clearFiltersEnable) { + this.clearFiltersEnable = clearFiltersEnable; + } + private final AtomicLong connectionIdSeed = new AtomicLong(10000); private final AtomicLong statementIdSeed = new AtomicLong(20000); private final AtomicLong resultSetIdSeed = new AtomicLong(50000); diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 424cb19bd0..d4a278b587 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -128,6 +128,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat private volatile boolean enable = true; private boolean resetStatEnable = true; + private final AtomicLong resetCount = new AtomicLong(); private String initStackTrace; @@ -214,6 +215,22 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } } } + { + String property = properties.getProperty("druid.clearFiltersEnable"); + if ("true".equals(property)) { + this.setClearFiltersEnable(true); + } else if ("false".equals(property)) { + this.setClearFiltersEnable(false); + } + } + { + String property = properties.getProperty("druid.resetStatEnable"); + if ("true".equals(property)) { + this.setResetStatEnable(true); + } else if ("false".equals(property)) { + this.setResetStatEnable(false); + } + } } public boolean isUseGloalDataSourceStat() { @@ -234,6 +251,9 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat public void setResetStatEnable(boolean resetStatEnable) { this.resetStatEnable = resetStatEnable; + if (dataSourceStat != null) { + dataSourceStat.setResetStatEnable(resetStatEnable); + } } public long getDiscardCount() { @@ -258,7 +278,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } public void resetStat() { - if (!resetStatEnable) { + if (!isResetStatEnable()) { return; } @@ -298,6 +318,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat transactionHistogram.reset(); cachedPreparedStatementDeleteCount.set(0); recycleErrorCount.set(0); + + resetCount.incrementAndGet(); + } + + public long getResetCount() { + return this.resetCount.get(); } public boolean isEnable() { @@ -558,6 +584,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } else { dataSourceStat = new JdbcDataSourceStat(this.name, this.jdbcUrl, this.dbType, this.connectProperties); } + dataSourceStat.setResetStatEnable(this.resetStatEnable); connections = new DruidConnectionHolder[maxActive]; @@ -616,6 +643,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat String threadName = "Druid-ConnectionPool-Log-" + System.identityHashCode(this); logStatsThread = new LogStatsThread(threadName); logStatsThread.start(); + + this.resetStatEnable = false; } private void createAndStartDestroyThread() { @@ -1032,7 +1061,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat this.discardConnection(holder.getConnection()); holder.setDiscard(true); pooledConnection.disable(t); - + LOG.error("discard connection", sqlEx); } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceMBean.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceMBean.java index b2798cc943..3af9d08463 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceMBean.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceMBean.java @@ -24,6 +24,7 @@ import javax.management.ObjectName; * @author wenshao */ public interface DruidDataSourceMBean extends DruidAbstractDataSourceMBean { + long getResetCount(); boolean isEnable(); diff --git a/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java b/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java index f06d26a535..6acedfe834 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java @@ -66,12 +66,17 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { // }); - private final ConcurrentMap connections = new ConcurrentHashMap(16, 0.75f, 1); + private final ConcurrentMap connections = new ConcurrentHashMap( + 16, + 0.75f, + 1); private final AtomicLong clobOpenCount = new AtomicLong(); private final AtomicLong blobOpenCount = new AtomicLong(); + private boolean resetStatEnable = true; + private static JdbcDataSourceStat global; static { @@ -92,6 +97,18 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { public static void setGlobal(JdbcDataSourceStat value) { global = value; } + + public void configFromProperties(Properties properties) { + + } + + public boolean isResetStatEnable() { + return resetStatEnable; + } + + public void setResetStatEnable(boolean resetStatEnable) { + this.resetStatEnable = resetStatEnable; + } public JdbcDataSourceStat(String name, String url){ this(name, url, null); @@ -187,6 +204,10 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { } public void reset() { + if (!isResetStatEnable()) { + return; + } + blobOpenCount.set(0); clobOpenCount.set(0); diff --git a/src/test/java/com/alibaba/druid/bvt/filter/ClearFilterTest.java b/src/test/java/com/alibaba/druid/bvt/filter/ClearFilterTest.java index acfac7d718..a70688a985 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/ClearFilterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/ClearFilterTest.java @@ -4,6 +4,7 @@ import junit.framework.TestCase; import org.junit.Assert; +import com.alibaba.druid.filter.encoding.EncodingConvertFilter; import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.pool.DruidDataSource; @@ -17,6 +18,20 @@ public class ClearFilterTest extends TestCase { dataSource.setFilters("!stat"); Assert.assertEquals(1, dataSource.getProxyFilters().size()); Assert.assertEquals(StatFilter.class.getName(), dataSource.getFilterClassNames().get(0)); + dataSource.setClearFiltersEnable(false); + dataSource.setFilters("!encoding"); + Assert.assertEquals(StatFilter.class.getName(), dataSource.getFilterClassNames().get(0)); + Assert.assertEquals(EncodingConvertFilter.class.getName(), dataSource.getFilterClassNames().get(1)); + + dataSource.setConnectionProperties("druid.clearFiltersEnable=false"); + Assert.assertFalse(dataSource.isClearFiltersEnable()); + + dataSource.setConnectionProperties("druid.clearFiltersEnable=true"); + Assert.assertTrue(dataSource.isClearFiltersEnable()); + + dataSource.setConnectionProperties("druid.clearFiltersEnable=xx"); // no change + Assert.assertTrue(dataSource.isClearFiltersEnable()); + dataSource.close(); } } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TimeBetweenLogStatsMillisTest.java b/src/test/java/com/alibaba/druid/bvt/pool/TimeBetweenLogStatsMillisTest.java index 7179724e94..c3d0e25dbd 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TimeBetweenLogStatsMillisTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TimeBetweenLogStatsMillisTest.java @@ -24,7 +24,18 @@ public class TimeBetweenLogStatsMillisTest extends TestCase { } public void test_0() throws Exception { + Assert.assertEquals(true, dataSource.isResetStatEnable()); dataSource.init(); Assert.assertEquals(1000, dataSource.getTimeBetweenLogStatsMillis()); + Assert.assertEquals(false, dataSource.isResetStatEnable()); + dataSource.resetStat(); + Assert.assertEquals(0, dataSource.getResetCount()); + dataSource.setConnectionProperties("druid.resetStatEnable=true"); + Assert.assertEquals(true, dataSource.isResetStatEnable()); + + dataSource.setConnectionProperties("druid.resetStatEnable=false"); + Assert.assertEquals(false, dataSource.isResetStatEnable()); + + dataSource.setConnectionProperties("druid.resetStatEnable=xxx"); } }