improve filter's config

This commit is contained in:
wenshao
2013-06-15 00:55:36 +08:00
parent d27e97f126
commit b1ea268f43
6 changed files with 96 additions and 7 deletions
@@ -135,6 +135,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements
System.out);
protected List<Filter> filters = new CopyOnWriteArrayList<Filter>();
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);
@@ -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);
}
@@ -24,6 +24,7 @@ import javax.management.ObjectName;
* @author wenshao<szujobs@hotmail.com>
*/
public interface DruidDataSourceMBean extends DruidAbstractDataSourceMBean {
long getResetCount();
boolean isEnable();
@@ -66,12 +66,17 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
//
});
private final ConcurrentMap<Long, JdbcConnectionStat.Entry> connections = new ConcurrentHashMap<Long, JdbcConnectionStat.Entry>(16, 0.75f, 1);
private final ConcurrentMap<Long, JdbcConnectionStat.Entry> connections = new ConcurrentHashMap<Long, JdbcConnectionStat.Entry>(
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);
@@ -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();
}
}
@@ -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");
}
}