mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
DruidStat: support jndi datasource
This commit is contained in:
@@ -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"));
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user