DruidStat: support jndi datasource

This commit is contained in:
sand
2012-08-06 22:13:19 +08:00
parent fa33267fc3
commit 82370048b3
3 changed files with 140 additions and 9 deletions
@@ -0,0 +1,86 @@
package com.alibaba.druid.stat;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.util.ReflectionUtils;
/**
* @author sandzhang<sandzhangtoo@gmail.com>
*/
public class DruidStatManagerFacade {
private final static DruidStatManagerFacade instance = new DruidStatManagerFacade();
private boolean inited = false;
protected final ReentrantLock lock = new ReentrantLock(true);
private DruidDataSourceStatManager druidDataSourceStatManager;
private JdbcStatManager jdbcStatManager;
private Set<DruidDataSource> datasourceInstances;
private DruidStatManagerFacade() {
}
public static DruidStatManagerFacade getInstance() {
return instance;
}
private void init() {
if (inited) {
return;
}
lock.lock();
if (inited) {
return;
}
try {
initByClassLoader();
inited = true;
} finally {
lock.unlock();
}
}
@SuppressWarnings("unchecked")
private void initByClassLoader() {
Class<?> druidDataSourceStatManagerClass = ReflectionUtils.getClassFromWebContainerOrCurrentClassLoader("com.alibaba.druid.stat.DruidDataSourceStatManager");
druidDataSourceStatManager = (DruidDataSourceStatManager) ReflectionUtils.callStaticMethod(druidDataSourceStatManagerClass,
"getInstance");
datasourceInstances = (Set<DruidDataSource>) ReflectionUtils.callStaticMethod(druidDataSourceStatManagerClass,
"getDruidDataSourceInstances");
Class<?> jdbcStatManagerClass = ReflectionUtils.getClassFromWebContainerOrCurrentClassLoader("com.alibaba.druid.stat.JdbcStatManager");
jdbcStatManager = (JdbcStatManager) ReflectionUtils.callStaticMethod(jdbcStatManagerClass, "getInstance");
}
public Set<DruidDataSource> getDruidDataSourceInstances() {
init();
return datasourceInstances;
}
public void resetDataSourceStat() {
init();
druidDataSourceStatManager.reset();
}
public void resetSqlStat() {
init();
jdbcStatManager.reset();
}
public void resetAll() {
init();
resetSqlStat();
resetDataSourceStat();
}
}
@@ -22,9 +22,8 @@ import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.stat.DruidDataSourceStatManager;
import com.alibaba.druid.stat.DruidStatManagerFacade;
import com.alibaba.druid.stat.JdbcSqlStat;
import com.alibaba.druid.stat.JdbcStatManager;
import com.alibaba.druid.util.IOUtils;
import com.alibaba.druid.util.MapComparator;
import com.alibaba.druid.util.StringUtils;
@@ -50,6 +49,8 @@ public class StatViewServlet extends HttpServlet {
private final static String TEMPLATE_PAGE_RESOURCE_PATH = RESOURCE_PATH + "/template.html";
private static final String DEFAULT_ORDER_TYPE = "asc";
private static DruidStatManagerFacade druidStatManager=DruidStatManagerFacade.getInstance();
public String templatePage;
@@ -251,8 +252,7 @@ public class StatViewServlet extends HttpServlet {
}
private void resetAllStat() {
JdbcStatManager.getInstance().reset();
DruidDataSourceStatManager.getInstance().reset();
druidStatManager.resetAll();
}
private List<String> getDriversData() {
@@ -275,7 +275,7 @@ public class StatViewServlet extends HttpServlet {
private List<Object> getDataSourceStatList() {
List<Object> datasourceList = new ArrayList<Object>();
for (DruidDataSource dataSource : DruidDataSourceStatManager.getDruidDataSourceInstances()) {
for (DruidDataSource dataSource : druidStatManager.getDruidDataSourceInstances()) {
datasourceList.add(dataSourceToMapData(dataSource));
}
return datasourceList;
@@ -298,7 +298,7 @@ public class StatViewServlet extends HttpServlet {
}
private JdbcSqlStat getSqlStatById(Integer id) {
for (DruidDataSource ds : DruidDataSourceStatManager.getDruidDataSourceInstances()) {
for (DruidDataSource ds : druidStatManager.getDruidDataSourceInstances()) {
JdbcSqlStat sqlStat = ds.getDataSourceStat().getSqlStat(id);
if (sqlStat != null) return sqlStat;
}
@@ -309,7 +309,7 @@ public class StatViewServlet extends HttpServlet {
if (identity == null) {
return null;
}
for (DruidDataSource datasource : DruidDataSourceStatManager.getDruidDataSourceInstances()) {
for (DruidDataSource datasource : druidStatManager.getDruidDataSourceInstances()) {
if (System.identityHashCode(datasource) == identity) {
return datasource;
}
@@ -337,12 +337,12 @@ public class StatViewServlet extends HttpServlet {
if (perPageCount == null) perPageCount = DEFAULT_PER_PAGE_COUNT;
List<Map<String, Object>> array = new ArrayList<Map<String, Object>>();
for (DruidDataSource datasource : DruidDataSourceStatManager.getDruidDataSourceInstances()) {
for (DruidDataSource datasource : druidStatManager.getDruidDataSourceInstances()) {
for (JdbcSqlStat sqlStat : datasource.getDataSourceStat().getSqlStatMap().values()) {
if (sqlStat.getExecuteCount() == 0 && sqlStat.getRunningCount() == 0) {
continue;
}
array.add(getSqlStatData(sqlStat));
}
}
@@ -0,0 +1,45 @@
package com.alibaba.druid.util;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
/**
* @author sandzhang<sandzhangtoo@gmail.com>
*/
public class ReflectionUtils {
public static Class<?> getClassFromWebContainerOrCurrentClassLoader(String className) {
Class<?> result = null;
try {
result = HttpServletRequest.class.getClassLoader().loadClass(className);
} catch (ClassNotFoundException e) {
}
if (result == null) {
try {
result = Thread.currentThread().getContextClassLoader().loadClass(className);
} catch (ClassNotFoundException e) {
}
}
return result;
}
public static Object callStaticMethod(Class<?> classObject, String methodName) {
try {
Method m = classObject.getMethod(methodName);
return m.invoke(classObject);
} catch (Exception e) {
return null;
}
}
public static String getTest() {
return "test";
}
public static void main(String args[]) {
System.out.println(callStaticMethod(ReflectionUtils.class, "getTest"));
}
}