mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improve filter's config
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user