diff --git a/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java b/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java index c84230233e..0177f2e4ee 100644 --- a/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java +++ b/src/main/java/com/alibaba/druid/stat/service/DruidStatService.java @@ -51,19 +51,31 @@ public class DruidStatService { for (DruidDataSource dataSource : DruidDataSourceStatManager.getDruidDataSourceInstances()) { DataSourceInfo dataSourceStat = new DataSourceInfo(); + dataSourceStat.setId(dataSource.getID()); dataSourceStat.setUrl(dataSource.getUrl()); dataSourceStat.setDbType(dataSource.getDbType()); + dataSourceStat.setActiveCount(dataSource.getActiveCount()); + dataSourceStat.setActivePeak(dataSource.getActivePeak()); + dataSourceStat.setCloseCount((int) dataSource.getCloseCount()); + dataSourceStat.setConnectCount((int) dataSource.getConnectCount()); + dataSourceStat.setConnectErrorCount((int) dataSource.getConnectErrorCount()); + dataSourceStat.setCreateCount((int) dataSource.getCreateCount()); + dataSourceStat.setCreateErrorCount((int) dataSource.getCreateErrorCount()); + dataSourceStat.setDestoryCount((int) dataSource.getDestroyCount()); + dataSourceStat.setExecuteCount((int) dataSource.getExecuteCount()); + dataSourceStat.setPoolingCount(dataSource.getPoolingCount()); + Collection sqlStats = dataSource.getDataSourceStat().getSqlStatMap().values(); - + List sqlStatInfoList = new ArrayList(sqlStats.size()); for (JdbcSqlStat sqlStat : dataSource.getDataSourceStat().getSqlStatMap().values()) { SqlInfo sqlStatInfo = new SqlInfo(); - + if (sqlStat.getExecuteCount() == 0 && sqlStat.getRunningCount() == 0) { continue; } - + sqlStatInfo.setSql(sqlStat.getSql()); sqlStatInfo.setExecuteCount((int) sqlStat.getExecuteCount()); sqlStatInfo.setRunningCount((int) sqlStat.getRunningCount()); @@ -72,12 +84,12 @@ public class DruidStatService { sqlStatInfo.setInTransactionCount((int) sqlStat.getInTransactionCount()); sqlStatInfo.setFetchRowCount(sqlStat.getFetchRowCount()); sqlStatInfo.setUpdateCount(sqlStat.getUpdateCount()); - + sqlStatInfoList.add(sqlStatInfo); } - + dataSourceStat.setSqlList(sqlStatInfoList); - + dataSourceStatList.add(dataSourceStat); } diff --git a/src/main/java/com/alibaba/druid/stat/service/dto/DataSourceInfo.java b/src/main/java/com/alibaba/druid/stat/service/dto/DataSourceInfo.java index 2b27dadf97..0359b1f144 100644 --- a/src/main/java/com/alibaba/druid/stat/service/dto/DataSourceInfo.java +++ b/src/main/java/com/alibaba/druid/stat/service/dto/DataSourceInfo.java @@ -4,9 +4,26 @@ import java.util.List; public class DataSourceInfo { + private long id; private String url; private String dbType; + private int activeCount; + private int activePeak; + + private int poolingCount; + + private int connectCount; + private int connectErrorCount; + + private int createCount; + private int createErrorCount; + + private int executeCount; + + private int closeCount; + private int destoryCount; + private List sqlList; public String getDbType() { @@ -33,4 +50,92 @@ public class DataSourceInfo { this.sqlList = sqlList; } + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public int getActiveCount() { + return activeCount; + } + + public void setActiveCount(int activeCount) { + this.activeCount = activeCount; + } + + public int getActivePeak() { + return activePeak; + } + + public void setActivePeak(int activePeak) { + this.activePeak = activePeak; + } + + public int getPoolingCount() { + return poolingCount; + } + + public void setPoolingCount(int poolingCount) { + this.poolingCount = poolingCount; + } + + public int getConnectCount() { + return connectCount; + } + + public void setConnectCount(int connectCount) { + this.connectCount = connectCount; + } + + public int getConnectErrorCount() { + return connectErrorCount; + } + + public void setConnectErrorCount(int connectErrorCount) { + this.connectErrorCount = connectErrorCount; + } + + public int getCreateCount() { + return createCount; + } + + public void setCreateCount(int createCount) { + this.createCount = createCount; + } + + public int getCreateErrorCount() { + return createErrorCount; + } + + public void setCreateErrorCount(int createErrorCount) { + this.createErrorCount = createErrorCount; + } + + public int getExecuteCount() { + return executeCount; + } + + public void setExecuteCount(int executeCount) { + this.executeCount = executeCount; + } + + public int getCloseCount() { + return closeCount; + } + + public void setCloseCount(int closeCount) { + this.closeCount = closeCount; + } + + public int getDestoryCount() { + return destoryCount; + } + + public void setDestoryCount(int destoryCount) { + this.destoryCount = destoryCount; + } + } diff --git a/src/main/java/com/alibaba/druid/stat/service/impl/DruidStatMemoryStore.java b/src/main/java/com/alibaba/druid/stat/service/impl/DruidStatMemoryStore.java index 8195ca9758..0df8e0f052 100644 --- a/src/main/java/com/alibaba/druid/stat/service/impl/DruidStatMemoryStore.java +++ b/src/main/java/com/alibaba/druid/stat/service/impl/DruidStatMemoryStore.java @@ -1,16 +1,37 @@ package com.alibaba.druid.stat.service.impl; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; import com.alibaba.druid.stat.service.DruidStatStore; import com.alibaba.druid.stat.service.dto.DataSourceInfo; - public class DruidStatMemoryStore implements DruidStatStore { + private ConcurrentHashMap dataSourceDataMap = new ConcurrentHashMap(); + @Override public void saveDataSource(long timeMillis, List dataSourceList) { - + for (DataSourceInfo dataSourceInfo : dataSourceList) { + DataSourceData data = dataSourceDataMap.get(dataSourceInfo.getId()); + + if (data == null) { + dataSourceDataMap.putIfAbsent(dataSourceInfo.getId(), new DataSourceData()); + data = dataSourceDataMap.get(dataSourceInfo.getId()); + } + + data.add(timeMillis, dataSourceInfo); + } + } + + public static class DataSourceData { + + private ConcurrentSkipListMap data = new ConcurrentSkipListMap(); + + public void add(long timeMillis, DataSourceInfo dataSourceInfo) { + data.put(timeMillis, dataSourceInfo); + } } }