This commit is contained in:
温少
2012-03-17 12:50:18 +08:00
parent 6de22b54df
commit 00ac9333e3
8 changed files with 73 additions and 22 deletions
@@ -59,6 +59,8 @@ import com.alibaba.druid.proxy.jdbc.StatementProxy;
public interface Filter {
void init(DataSourceProxy dataSource);
void destory();
ConnectionProxy connection_connect(FilterChain chain, Properties info) throws SQLException;
@@ -67,6 +67,11 @@ public abstract class FilterAdapter extends NotificationBroadcasterSupport imple
public void init(DataSourceProxy dataSource) {
this.dataSource = dataSource;
}
@Override
public void destory() {
}
@Override
public Array callableStatement_getArray(FilterChain chain, CallableStatementProxy statement, int parameterIndex)
@@ -123,7 +123,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
}
@Override
public void init(DataSourceProxy dataSource) {
public synchronized void init(DataSourceProxy dataSource) {
this.dataSource = dataSource;
ConcurrentMap<String, JdbcDataSourceStat> dataSourceStats = JdbcStatManager.getInstance().getDataSources();
@@ -136,6 +136,19 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
}
this.dataSourceStat = stat;
}
@Override
public synchronized void destory() {
if (dataSource == null) {
return;
}
ConcurrentMap<String, JdbcDataSourceStat> dataSourceStats = JdbcStatManager.getInstance().getDataSources();
String url = dataSource.getUrl();
dataSourceStats.remove(url);
dataSource = null;
}
public ConnectionProxy connection_connect(FilterChain chain, Properties info) throws SQLException {
ConnectionProxy connection = null;
@@ -687,6 +687,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
notEmptySignalCount++;
this.closed = true;
for (Filter filter : filters) {
filter.destory();
}
} finally {
lock.unlock();
}
@@ -671,6 +671,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
public boolean visit(SQLExprTableSource x) {
if (isSimpleExprTableSource(x)) {
String ident = x.getExpr().toString();
if (variants.containsKey(ident)) {
return false;
}
if (subQueryMap.containsKey(ident)) {
return false;
@@ -391,7 +391,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
// 25 -
new ArrayType<Long>(SimpleType.LONG, true), //
new ArrayType<Long>(SimpleType.STRING, true), //
new ArrayType<String>(SimpleType.STRING, false), //
};
String[] indexNames = {
@@ -490,6 +490,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
map.put("InTransactionCount", getInTransactionCount());
map.put("Histogram", this.histogram.toArray());
map.put("LastSlowParameters", lastSlowParameters);
return map;
@@ -7,6 +7,7 @@ import junit.framework.TestCase;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
import com.alibaba.druid.stat.JdbcDataSourceStat;
import com.alibaba.druid.stat.JdbcStatManager;
public class DruidDataSourceFilterTest extends TestCase {
@@ -52,20 +53,24 @@ public class DruidDataSourceFilterTest extends TestCase {
dataSource.setFilters("stat");
JdbcStatManager.getInstance().reset();
dataSource.init();
Assert.assertEquals(1, JdbcStatManager.getInstance().getDataSources().size());
JdbcDataSourceStat dataSourceStat = JdbcStatManager.getInstance().getDataSources().values().iterator().next();
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(0, dataSourceStat.getConnectionStat().getConnectCount());
Assert.assertEquals(1, dataSource.getProxyFilters().size());
for (int i = 0; i < 2; ++i) {
Connection conn = dataSource.getConnection();
Assert.assertEquals(1, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getCloseCount());
Assert.assertEquals(1, dataSourceStat.getConnectionStat().getConnectCount());
Assert.assertEquals(0, dataSourceStat.getConnectionStat().getCloseCount());
conn.close();
Assert.assertEquals(1, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getCloseCount()); // logic
Assert.assertEquals(1, dataSourceStat.getConnectionStat().getConnectCount());
Assert.assertEquals(0, dataSourceStat.getConnectionStat().getCloseCount()); // logic
// close不会导致计数器+1
}
@@ -73,7 +78,7 @@ public class DruidDataSourceFilterTest extends TestCase {
dataSource.close();
Assert.assertEquals(1, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(1, JdbcStatManager.getInstance().getConnectionstat().getCloseCount());
Assert.assertEquals(1, dataSourceStat.getConnectionStat().getConnectCount());
Assert.assertEquals(1, dataSourceStat.getConnectionStat().getCloseCount());
}
}
@@ -7,6 +7,7 @@ import junit.framework.TestCase;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
import com.alibaba.druid.stat.JdbcDataSourceStat;
import com.alibaba.druid.stat.JdbcStatManager;
public class ParamTest extends TestCase {
@@ -29,31 +30,39 @@ public class ParamTest extends TestCase {
JdbcStatManager.getInstance().reset();
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
dataSource.init();
Assert.assertEquals(1, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
Assert.assertEquals(1, JdbcStatManager.getInstance().getDataSources().size());
JdbcDataSourceStat stat = JdbcStatManager.getInstance().getDataSources().values().iterator().next();
Assert.assertEquals(0, stat.getConnectionStat().getConnectCount());
Assert.assertEquals(1, dataSource.getProxyFilters().size());
for (int i = 0; i < 2; ++i) {
Connection conn = dataSource.getConnection();
Assert.assertEquals(1, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getCloseCount());
Assert.assertEquals(1, stat.getConnectionStat().getConnectCount());
Assert.assertEquals(0, stat.getConnectionStat().getCloseCount());
conn.close();
Assert.assertEquals(1, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getCloseCount()); // logic
// close不会导致计数器+1
Assert.assertEquals(1, stat.getConnectionStat().getConnectCount());
Assert.assertEquals(0, stat.getConnectionStat().getCloseCount()); // logic
// close不会导致计数器+1
}
dataSource.close();
Assert.assertEquals(1, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(1, JdbcStatManager.getInstance().getConnectionstat().getCloseCount());
Assert.assertEquals(0, JdbcStatManager.getInstance().getDataSources().size());
Assert.assertEquals(1, stat.getConnectionStat().getConnectCount());
Assert.assertEquals(1, stat.getConnectionStat().getCloseCount());
JdbcStatManager.getInstance().reset();
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getCloseCount());
Assert.assertEquals(1, stat.getConnectionStat().getConnectCount());
Assert.assertEquals(1, stat.getConnectionStat().getCloseCount());
}
public void test_zero() throws Exception {
@@ -70,7 +79,9 @@ public class ParamTest extends TestCase {
JdbcStatManager.getInstance().reset();
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(0, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
Assert.assertEquals(0, JdbcStatManager.getInstance().getDataSources().size());
Assert.assertEquals(1, dataSource.getProxyFilters().size());
Exception error = null;
@@ -96,15 +107,21 @@ public class ParamTest extends TestCase {
Assert.assertEquals(1, dataSource.getProxyFilters().size());
JdbcStatManager.getInstance().reset();
dataSource.init();
Assert.assertEquals(1, DruidDataSourceStatManager.getInstance().getDataSourceList().size());
Assert.assertEquals(1, JdbcStatManager.getInstance().getDataSources().size());
Assert.assertEquals(0, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
JdbcDataSourceStat stat = JdbcStatManager.getInstance().getDataSources().values().iterator().next();
Assert.assertEquals(10, stat.getConnectionStat().getConnectCount());
for (int i = 0; i < 10; ++i) {
Connection conn = dataSource.getConnection();
conn.close();
}
Assert.assertEquals(10, JdbcStatManager.getInstance().getConnectionstat().getConnectCount());
Assert.assertEquals(10, stat.getConnectionStat().getConnectCount());
dataSource.close();
}