refactor for reset

This commit is contained in:
温少
2012-03-20 05:57:11 +08:00
parent 7afe314b26
commit a26954e672
3 changed files with 72 additions and 45 deletions
@@ -135,17 +135,17 @@ 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;
}
@@ -398,7 +398,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
sqlStat.decrementExecutingCount();
sqlStat.addExecuteTime(nanoSpan);
long millis = nanoSpan / (1000 * 1000);
if (millis >= slowSqlMillis) {
StringBuilder buf = new StringBuilder();
@@ -436,7 +436,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
}
}
}
buf.append('"');
buf.append('"');
} else if (value instanceof Number) {
buf.append(value.toString());
} else if (value instanceof java.util.Date) {
@@ -675,27 +675,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
}
public JdbcSqlStat createSqlStat(StatementProxy statement, String sql) {
final ConcurrentMap<String, JdbcSqlStat> sqlStatMap = dataSourceStat.getSqlStatMap();
JdbcSqlStat sqlStat = sqlStatMap.get(sql);
if (sqlStat == null) {
if (dataSourceStat.getSqlStatMap().size() >= maxSqlStatCount) {
return null;
}
JdbcSqlStat newSqlStat = new JdbcSqlStat(sql);
if (dataSourceStat.getSqlStatMap().putIfAbsent(sql, newSqlStat) == null) {
newSqlStat.setId(JdbcStatManager.getInstance().generateSqlId());
newSqlStat.setDataSource(this.dataSource.getUrl());
}
sqlStat = dataSourceStat.getSqlStatMap().get(sql);
}
if (sqlStat == null) {
LOG.error("stat is null");
}
return sqlStat;
return dataSourceStat.createSqlStat(sql);
}
public static JdbcSqlStat getSqlStat(StatementProxy statement) {
@@ -711,11 +691,7 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
}
public JdbcSqlStat getSqlStat(String sql) {
return dataSourceStat.getSqlStatMap().get(sql);
}
public ConcurrentMap<String, JdbcSqlStat> getSqlStatisticMap() {
return dataSourceStat.getSqlStatMap();
return dataSourceStat.getSqlStat(sql);
}
@Override
@@ -15,9 +15,12 @@
*/
package com.alibaba.druid.stat;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.management.JMException;
import javax.management.openmbean.CompositeType;
@@ -38,7 +41,15 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
private final JdbcResultSetStat resultSetStat = new JdbcResultSetStat();
private final JdbcStatementStat statementStat = new JdbcStatementStat();
private final ConcurrentMap<String, JdbcSqlStat> sqlStatMap = new ConcurrentHashMap<String, JdbcSqlStat>();
private int maxSize = 2048;
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final LinkedHashMap<String, JdbcSqlStat> sqlStatMap = new LinkedHashMap<String, JdbcSqlStat>(
maxSize,
0.75f,
true);
// private final ConcurrentMap<String, JdbcSqlStat> sqlStatMap = new ConcurrentHashMap<String, JdbcSqlStat>();
private final ConcurrentMap<Long, JdbcConnectionStat.Entry> connections = new ConcurrentHashMap<Long, JdbcConnectionStat.Entry>();
@@ -52,7 +63,14 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
statementStat.reset();
resultSetStat.reset();
sqlStatMap.clear();
lock.readLock().lock();
try {
for (JdbcSqlStat stat : sqlStatMap.values()) {
stat.reset();
}
} finally {
lock.readLock().unlock();
}
for (JdbcConnectionStat.Entry connectionStat : connections.values()) {
connectionStat.reset();
@@ -77,12 +95,9 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
return url;
}
public JdbcSqlStat getSqlStat(String sql) {
return this.sqlStatMap.get(sql);
}
@Override
public TabularData getSqlList() throws JMException {
Map<String, JdbcSqlStat> sqlStatMap = this.getSqlStatMap();
CompositeType rowType = JdbcSqlStat.getCompositeType();
String[] indexNames = rowType.keySet().toArray(new String[rowType.keySet().size()]);
@@ -107,13 +122,18 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
}
public JdbcSqlStat getSqlStat(long id) {
for (Map.Entry<String, JdbcSqlStat> entry : this.sqlStatMap.entrySet()) {
if (entry.getValue().getId() == id) {
return entry.getValue();
lock.readLock().lock();
try {
for (Map.Entry<String, JdbcSqlStat> entry : this.sqlStatMap.entrySet()) {
if (entry.getValue().getId() == id) {
return entry.getValue();
}
}
}
return null;
return null;
} finally {
lock.readLock().unlock();
}
}
public final ConcurrentMap<Long, JdbcConnectionStat.Entry> getConnections() {
@@ -144,8 +164,39 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean {
return url;
}
public ConcurrentMap<String, JdbcSqlStat> getSqlStatMap() {
return sqlStatMap;
public Map<String, JdbcSqlStat> getSqlStatMap() {
Map<String, JdbcSqlStat> map = new HashMap<String, JdbcSqlStat>();
lock.readLock().lock();
try {
map.putAll(sqlStatMap);
} finally {
lock.readLock().unlock();
}
return map;
}
public JdbcSqlStat getSqlStat(String sql) {
lock.readLock().lock();
try {
return sqlStatMap.get(sql);
} finally {
lock.readLock().unlock();
}
}
public JdbcSqlStat createSqlStat(String sql) {
lock.writeLock().lock();
try {
JdbcSqlStat sqlStat = sqlStatMap.get(sql);
if (sqlStat == null) {
sqlStat = new JdbcSqlStat(sql);
sqlStatMap.put(sql, sqlStat);
}
return sqlStat;
} finally {
lock.writeLock().unlock();
}
}
@Override
@@ -306,7 +306,7 @@ public class JdbcStatManager implements JdbcStatManagerMBean {
TabularData data = new TabularDataSupport(tabularType);
for (JdbcDataSourceStat dataSource : dataSources.values()) {
ConcurrentMap<String, JdbcSqlStat> statMap = dataSource.getSqlStatMap();
Map<String, JdbcSqlStat> statMap = dataSource.getSqlStatMap();
for (Map.Entry<String, JdbcSqlStat> entry : statMap.entrySet()) {
Map<String, Object> map = entry.getValue().getData();
map.put("URL", dataSource.getUrl());