diff --git a/src/main/java/org/olat/restapi/system/DatabaseWebService.java b/src/main/java/org/olat/restapi/system/DatabaseWebService.java index d9ea9f972cb0d8f7bfffa061f905ef4c0453d5f8..d06aa97b4534233217cfd9b5b3dd90db1e999482 100644 --- a/src/main/java/org/olat/restapi/system/DatabaseWebService.java +++ b/src/main/java/org/olat/restapi/system/DatabaseWebService.java @@ -19,8 +19,10 @@ */ package org.olat.restapi.system; -import java.util.Collection; +import java.util.Set; +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanInfo; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.ws.rs.GET; @@ -38,8 +40,6 @@ import org.olat.restapi.system.vo.DatabaseConnectionVO; import org.olat.restapi.system.vo.DatabaseVO; import org.olat.restapi.system.vo.HibernateStatisticsVO; -import com.mchange.v2.c3p0.PooledDataSource; - /** * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com @@ -92,33 +92,86 @@ public class DatabaseWebService { private DatabaseConnectionVO getConnectionInfos() { DatabaseConnectionVO vo = new DatabaseConnectionVO(); + vo.setActiveConnectionCount(0); + vo.setCurrentConnectionCount(0); try { - int activeConnectionCount = 0; - int currentConnectionCount = 0; - JMXManager jmxManager = CoreSpringFactory.getImpl(JMXManager.class); MBeanServer mBeanServer = jmxManager.getMBeanServer(); - ObjectName c3p0ObjectName = new ObjectName("com.mchange.v2.c3p0:type=C3P0Registry"); + boolean found = searchC3P0DataSources(mBeanServer, vo) || searchTomcatDataSources(mBeanServer, vo); + if(log.isDebug()) { + log.debug("MBean for datasource found: " + found); + } + } catch (Exception e) { + log.error("", e); + } + return vo; + } + + private boolean searchC3P0DataSources(MBeanServer mBeanServer, DatabaseConnectionVO vo) { + try { + ObjectName poolName = new ObjectName("com.mchange.v2.c3p0:type=*,*"); + Set<ObjectName> names = mBeanServer.queryNames(poolName, null); + if(names.size() > 0) { + int activeConnectionCount = 0; + int currentConnectionCount = 0; - Object attributes = mBeanServer.getAttribute(c3p0ObjectName, "AllPooledDataSources"); - if(attributes instanceof Collection) { - @SuppressWarnings("unchecked") - Collection<Object> attributeCollection = (Collection<Object>)attributes; - for(Object attribute : attributeCollection) { - if(attribute instanceof PooledDataSource) { - PooledDataSource dataSource = (PooledDataSource)attribute; - activeConnectionCount += dataSource.getNumBusyConnectionsAllUsers(); - currentConnectionCount += dataSource.getNumConnectionsAllUsers(); + for(ObjectName name:names) { + String cName = name.getCanonicalName(); + if(cName.startsWith("com.mchange.v2.c3p0:type=PooledDataSource")) { + MBeanInfo info = mBeanServer.getMBeanInfo(name); + MBeanAttributeInfo[] attrs = info.getAttributes(); + for(MBeanAttributeInfo attr:attrs) { + String attrName = attr.getName(); + if("numBusyConnectionsAllUsers".equals(attrName)) { + Number obj = (Number)mBeanServer.getAttribute(name, "numBusyConnectionsAllUsers"); + activeConnectionCount += obj.intValue(); + } else if("numConnectionsAllUsers".equals(attrName)) { + Number obj = (Number)mBeanServer.getAttribute(name, "numConnectionsAllUsers"); + currentConnectionCount += obj.intValue(); + } + } } } + + vo.setActiveConnectionCount(activeConnectionCount); + vo.setCurrentConnectionCount(currentConnectionCount); + return true; } + } catch (Exception e) { + log.error("", e); + } + return false; + } + + private boolean searchTomcatDataSources(MBeanServer mBeanServer, DatabaseConnectionVO vo) { + try { + ObjectName poolName = new ObjectName("Catalina:type=DataSource,*"); + Set<ObjectName> names = mBeanServer.queryNames(poolName, null); + if(names.size() > 0) { + int activeConnectionCount = 0; + int idleConnectionCount = 0; + + for(ObjectName name:names) { + MBeanInfo info = mBeanServer.getMBeanInfo(name); + MBeanAttributeInfo[] attrs = info.getAttributes(); + for(MBeanAttributeInfo attr:attrs) { + String attrName = attr.getName(); + if("numActive".equals(attrName)) { + Number obj = (Number)mBeanServer.getAttribute(name, "numActive"); + activeConnectionCount += obj.intValue(); + } else if("numIdle".equals(attrName)) { + Number obj = (Number)mBeanServer.getAttribute(name, "numIdle"); + idleConnectionCount += obj.intValue(); + } + } + } - vo.setActiveConnectionCount(activeConnectionCount); - vo.setCurrentConnectionCount(currentConnectionCount); - + vo.setActiveConnectionCount(activeConnectionCount); + vo.setCurrentConnectionCount(activeConnectionCount - idleConnectionCount); + } } catch (Exception e) { log.error("", e); } - return vo; + return false; } }