From a26954e672ac8937db6bcdc51d535d99c6adb2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Tue, 20 Mar 2012 05:57:11 +0800 Subject: [PATCH] refactor for reset --- .../alibaba/druid/filter/stat/StatFilter.java | 38 ++------- .../druid/stat/JdbcDataSourceStat.java | 77 +++++++++++++++---- .../alibaba/druid/stat/JdbcStatManager.java | 2 +- 3 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java index 032c393686..d9a7b4b94b 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -135,17 +135,17 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { } this.dataSourceStat = stat; } - + @Override public synchronized void destory() { if (dataSource == null) { return; } - + ConcurrentMap 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 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 getSqlStatisticMap() { - return dataSourceStat.getSqlStatMap(); + return dataSourceStat.getSqlStat(sql); } @Override diff --git a/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java b/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java index 1004dd92c2..fc31c22776 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcDataSourceStat.java @@ -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 sqlStatMap = new ConcurrentHashMap(); + private int maxSize = 2048; + + private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private final LinkedHashMap sqlStatMap = new LinkedHashMap( + maxSize, + 0.75f, + true); + + // private final ConcurrentMap sqlStatMap = new ConcurrentHashMap(); private final ConcurrentMap connections = new ConcurrentHashMap(); @@ -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 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 entry : this.sqlStatMap.entrySet()) { - if (entry.getValue().getId() == id) { - return entry.getValue(); + lock.readLock().lock(); + try { + for (Map.Entry entry : this.sqlStatMap.entrySet()) { + if (entry.getValue().getId() == id) { + return entry.getValue(); + } } - } - return null; + return null; + } finally { + lock.readLock().unlock(); + } } public final ConcurrentMap getConnections() { @@ -144,8 +164,39 @@ public class JdbcDataSourceStat implements JdbcDataSourceStatMBean { return url; } - public ConcurrentMap getSqlStatMap() { - return sqlStatMap; + public Map getSqlStatMap() { + Map map = new HashMap(); + 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 diff --git a/src/main/java/com/alibaba/druid/stat/JdbcStatManager.java b/src/main/java/com/alibaba/druid/stat/JdbcStatManager.java index 0316f2a58f..389d4477f6 100644 --- a/src/main/java/com/alibaba/druid/stat/JdbcStatManager.java +++ b/src/main/java/com/alibaba/druid/stat/JdbcStatManager.java @@ -306,7 +306,7 @@ public class JdbcStatManager implements JdbcStatManagerMBean { TabularData data = new TabularDataSupport(tabularType); for (JdbcDataSourceStat dataSource : dataSources.values()) { - ConcurrentMap statMap = dataSource.getSqlStatMap(); + Map statMap = dataSource.getSqlStatMap(); for (Map.Entry entry : statMap.entrySet()) { Map map = entry.getValue().getData(); map.put("URL", dataSource.getUrl());