Author: indika
Date: Fri Oct 24 07:45:29 2008
New Revision: 707647
URL: http://svn.apache.org/viewvc?rev=707647&view=rev
Log:
Fix an issue in DB pool - A mistake
Add JMX monitoring for DB pool
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRegistrar.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRepository.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolView.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolViewMBean.java
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DataSourceInformation.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/InMemoryDataSourceRegistry.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceFactory.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceInformationFactory.java
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java?rev=707647&r1=707646&r2=707647&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java
Fri Oct 24 07:45:29 2008
@@ -26,6 +26,9 @@
import org.apache.synapse.mediators.db.Statement;
import org.apache.synapse.util.xpath.SynapseXPath;
import org.apache.synapse.util.datasource.DataSourceFinder;
+import org.apache.synapse.util.datasource.InMemoryDataSourceRegistry;
+import org.apache.synapse.util.datasource.DBPoolView;
+import org.apache.synapse.util.MBeanRepository;
import org.jaxen.JaxenException;
import javax.naming.Context;
@@ -140,6 +143,11 @@
mediator.addDataSourceProperty(DSNAME_Q, dsName);
DataSource dataSource = DataSourceFinder.find(dsName);
if (dataSource != null) {
+ MBeanRepository mBeanRepository =
InMemoryDataSourceRegistry.getInstance();
+ Object mBean = mBeanRepository.getMBean(dsName);
+ if (mBean instanceof DBPoolView) {
+ mediator.setDbPoolView((DBPoolView) mBean);
+ }
return dataSource;
}
Properties props = new Properties();
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java?rev=707647&r1=707646&r2=707647&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java
Fri Oct 24 07:45:29 2008
@@ -24,6 +24,8 @@
import org.apache.commons.logging.Log;
import org.apache.synapse.ManagedLifecycle;
import org.apache.synapse.MessageContext;
+import org.apache.synapse.SynapseException;
+import org.apache.synapse.util.datasource.DBPoolView;
import org.apache.synapse.config.xml.AbstractDBMediatorFactory;
import org.apache.synapse.core.SynapseEnvironment;
import org.apache.synapse.mediators.AbstractMediator;
@@ -44,6 +46,10 @@
protected Map dataSourceProps = new HashMap();
/** The DataSource to get DB connections */
private DataSource dataSource = null;
+ /**
+ * MBean for DBPool monitoring
+ */
+ private DBPoolView dbPoolView;
/** Statements */
List statementList = new ArrayList();
@@ -168,7 +174,38 @@
traceOrDebug(traceOn, "Getting a connection from DataSource " +
getDSName() +
" and preparing statement : " + stmnt.getRawStatement());
}
+
Connection con = getDataSource().getConnection();
+ if (con == null) {
+ String msg = "Connection from DataSource " + getDSName() + " is
null.";
+ log.error(msg);
+ throw new SynapseException(msg);
+ }
+
+ if (dataSource instanceof BasicDataSource) {
+
+ BasicDataSource basicDataSource = (BasicDataSource) dataSource;
+ int numActive = basicDataSource.getNumActive();
+ int numIdle = basicDataSource.getNumIdle();
+ String connectionId = Integer.toHexString(con.hashCode());
+
+
+ DBPoolView dbPoolView = getDbPoolView();
+ if (dbPoolView != null) {
+ dbPoolView.setNumActive(numActive);
+ dbPoolView.setNumIdle(numIdle);
+ dbPoolView.updateConnectionUsage(connectionId);
+ }
+
+ if (traceOrDebugOn) {
+ traceOrDebug(traceOn, "[ DB Connection : " + con + " ]");
+ traceOrDebug(traceOn, "[ DB Connection instance identifier : "
+
+ connectionId + " ]");
+ traceOrDebug(traceOn, "[ Number of Active Connection : " +
numActive + " ]");
+ traceOrDebug(traceOn, "[ Number of Idle Connection : " +
numIdle + " ]");
+ }
+ }
+
PreparedStatement ps = con.prepareStatement(stmnt.getRawStatement());
// set parameters if any
@@ -261,4 +298,12 @@
}
return ps;
}
+
+ public DBPoolView getDbPoolView() {
+ return dbPoolView;
+ }
+
+ public void setDbPoolView(DBPoolView dbPoolView) {
+ this.dbPoolView = dbPoolView;
+ }
}
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRegistrar.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRegistrar.java?rev=707647&view=auto
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRegistrar.java
(added)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRegistrar.java
Fri Oct 24 07:45:29 2008
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.synapse.util;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.SynapseException;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+import java.util.Set;
+
+public class MBeanRegistrar {
+
+ private static final MBeanRegistrar ourInstance = new MBeanRegistrar();
+ private static final Log log = LogFactory.getLog(MessageHelper.class);
+
+ public static MBeanRegistrar getInstance() {
+ return ourInstance;
+ }
+
+ private MBeanRegistrar() {
+ }
+
+ public void registerMBean(Object mbeanInstance, String category, String
id) {
+ assertNull(mbeanInstance, "Mbean instance is null");
+ assertNull(category, "Mbean instance category is null");
+ assertNull(id, "Mbean instance name is null");
+ try {
+ MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ ObjectName name = new ObjectName(getObjectName(category, id));
+ Set set = mbs.queryNames(name, null);
+ if (set != null && set.isEmpty()) {
+ mbs.registerMBean(mbeanInstance, name);
+ } else {
+ mbs.unregisterMBean(name);
+ mbs.registerMBean(mbeanInstance, name);
+ }
+ } catch (Exception e) {
+ log.warn("Error registering a MBean with name ' " + id +
+ " ' and category name ' " + category + "' for JMX
management", e);
+ }
+ }
+
+ public void unRegisterMBean(String category, String id) {
+ try {
+ MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ ObjectName objName = new ObjectName(getObjectName(category, id));
+ if (mbs.isRegistered(objName)) {
+ mbs.unregisterMBean(objName);
+ }
+ } catch (Exception e) {
+ log.warn("Error un-registering a MBean with name ' " + id +
+ " ' and category name ' " + category + "' for JMX
management", e);
+ }
+ }
+
+ private String getObjectName(String category, String id) {
+
+ String jmxAgentName = System.getProperty("jmx.agent.name");
+ if (jmxAgentName == null || "".equals(jmxAgentName)) {
+ jmxAgentName = "org.apache.synapse";
+ }
+ return jmxAgentName + ":Type=" + category + ",Name=" + id;
+ }
+
+ private void assertNull(String name, String msg) {
+ if (name == null || "".equals(name)) {
+ handleException(msg);
+ }
+ }
+
+ private void assertNull(Object object, String msg) {
+ if (object == null) {
+ handleException(msg);
+ }
+ }
+
+ private static void handleException(String msg) {
+ log.error(msg);
+ throw new SynapseException(msg);
+ }
+
+}
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRepository.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRepository.java?rev=707647&view=auto
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRepository.java
(added)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/MBeanRepository.java
Fri Oct 24 07:45:29 2008
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.synapse.util;
+
+/**
+ * MBean Repository for hold MBean locally
+ */
+public interface MBeanRepository {
+
+ public void addMBean(String name, Object mBean);
+
+ public Object getMBean(String name);
+
+}
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolView.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolView.java?rev=707647&view=auto
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolView.java
(added)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolView.java
Fri Oct 24 07:45:29 2008
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.synapse.util.datasource;
+
+
+import java.util.Map;
+import java.util.HashMap;
+
+
+/**
+ * DBPool monitoring
+ */
+public class DBPoolView implements DBPoolViewMBean {
+
+ private int numActive = 0;
+ private int numIdle = 0;
+ private final Map<String, Long> connectionsUsage = new HashMap<String,
Long>();
+ private String name;
+
+ public DBPoolView(String name) {
+ this.name = name;
+ }
+
+ public int getNumActive() {
+ return numActive;
+ }
+
+ public void setNumActive(int numActive) {
+ this.numActive = numActive;
+ }
+
+ public int getNumIdle() {
+ return numIdle;
+ }
+
+ public void setNumIdle(int numIdle) {
+ this.numIdle = numIdle;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void updateConnectionUsage(String connectionID) {
+ if (connectionID != null && !"".equals(connectionID)) {
+ Long currentUsage = connectionsUsage.get(connectionID);
+ if (currentUsage != null) {
+ currentUsage += 1;
+ connectionsUsage.put(connectionID,currentUsage);
+ } else {
+ connectionsUsage.put(connectionID, (long) 1);
+ }
+ }
+ }
+
+ public Map getConnectionUsage() {
+ return connectionsUsage;
+ }
+
+ public void reset() {
+ numActive = 0;
+ numIdle = 0;
+ connectionsUsage.clear();
+ }
+}
Added:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolViewMBean.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolViewMBean.java?rev=707647&view=auto
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolViewMBean.java
(added)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DBPoolViewMBean.java
Fri Oct 24 07:45:29 2008
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.synapse.util.datasource;
+
+import java.util.Map;
+
+/**
+ *
+ */
+public interface DBPoolViewMBean {
+
+ public int getNumActive();
+ public int getNumIdle();
+ public String getName();
+ public Map getConnectionUsage();
+ public void reset();
+}
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DataSourceInformation.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DataSourceInformation.java?rev=707647&r1=707646&r2=707647&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DataSourceInformation.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/DataSourceInformation.java
Fri Oct 24 07:45:29 2008
@@ -43,7 +43,7 @@
private boolean defaultReadOnly = false;
private boolean testOnBorrow = true;
private boolean testOnReturn = false;
- private int minIdle = GenericObjectPool.DEFAULT_MAX_IDLE;
+ private int minIdle = GenericObjectPool.DEFAULT_MIN_IDLE;
private int initialSize;
private int defaultTransactionIsolation = -1;
private String defaultCatalog;
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/InMemoryDataSourceRegistry.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/InMemoryDataSourceRegistry.java?rev=707647&r1=707646&r2=707647&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/InMemoryDataSourceRegistry.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/InMemoryDataSourceRegistry.java
Fri Oct 24 07:45:29 2008
@@ -25,6 +25,8 @@
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseException;
import org.apache.synapse.util.datasource.factory.DataSourceFactory;
+import org.apache.synapse.util.MBeanRepository;
+import org.apache.synapse.util.MBeanRegistrar;
import javax.sql.DataSource;
import java.util.HashMap;
@@ -34,12 +36,14 @@
/**
* Keeps all DataSources in the memory
*/
-public class InMemoryDataSourceRegistry implements DataSourceRegistry {
+public class InMemoryDataSourceRegistry implements DataSourceRegistry,
MBeanRepository {
private final static Log log =
LogFactory.getLog(InMemoryDataSourceRegistry.class);
private static final InMemoryDataSourceRegistry ourInstance = new
InMemoryDataSourceRegistry();
private final static Map<String, DataSource> dataSources = new
HashMap<String, DataSource>();
+ private final static Map<String, DBPoolView> dataSourcesMBeans = new
HashMap<String, DBPoolView>();
+ private final static String MBEAN_CATEGORY_DATABASE_CONNECTION_POOL =
"DatabaseConnectionPool";
public static InMemoryDataSourceRegistry getInstance() {
return ourInstance;
@@ -76,6 +80,7 @@
log.debug("Registering a DatSource with name : " + name + " in
Local Pool");
}
+ addMBean(name, new DBPoolView(name));
dataSources.put(name, dataSource);
}
@@ -86,9 +91,7 @@
*/
public DataSource lookUp(String name) {
- if (name == null || "".equals(name)) {
- handleException("DataSorce name cannot be found.");
- }
+ assertNull(name, "DataSorce name cannot be found.");
return dataSources.get(name);
}
@@ -105,10 +108,53 @@
log.info("Clearing all in-memory datasources ");
dataSources.clear();
}
+ if (!dataSourcesMBeans.isEmpty()) {
+ log.info("UnRegistering DBPool MBeans");
+ for (DBPoolView dbPoolView : dataSourcesMBeans.values()) {
+ if (dbPoolView != null) {
+ MBeanRegistrar.getInstance().unRegisterMBean(
+ MBEAN_CATEGORY_DATABASE_CONNECTION_POOL,
dbPoolView.getName());
+ }
+ }
+ dataSourcesMBeans.clear();
+ }
}
private static void handleException(String msg) {
log.error(msg);
throw new SynapseException(msg);
}
+
+ public void addMBean(String name, Object mBean) {
+ assertNull(name, "DataSorce MBean name cannot be found.");
+ assertNull(mBean, "DataSorce MBean cannot be found.");
+ assertFalse(mBean instanceof DBPoolView, "Given MBean instance is not
matched " +
+ "with the expected MBean - 'DBPoolView'.");
+ dataSourcesMBeans.put(name, (DBPoolView) mBean);
+ MBeanRegistrar mBeanRegistrar = MBeanRegistrar.getInstance();
+ mBeanRegistrar.registerMBean(mBean,
MBEAN_CATEGORY_DATABASE_CONNECTION_POOL, name);
+ }
+
+ public Object getMBean(String name) {
+ assertNull(name, "DataSorce MBean name cannot be found.");
+ return dataSourcesMBeans.get(name);
+ }
+
+ private void assertNull(String name, String msg) {
+ if (name == null || "".equals(name)) {
+ handleException(msg);
+ }
+ }
+
+ private void assertNull(Object object, String msg) {
+ if (object == null) {
+ handleException(msg);
+ }
+ }
+
+ private void assertFalse(boolean condition, String msg) {
+ if (!condition) {
+ handleException(msg);
+ }
+ }
}
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceFactory.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceFactory.java?rev=707647&r1=707646&r2=707647&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceFactory.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceFactory.java
Fri Oct 24 07:45:29 2008
@@ -84,7 +84,7 @@
basicDataSource.setMaxActive(information.getMaxActive());
basicDataSource.setMaxIdle(information.getMaxIdle());
basicDataSource.setMaxWait(information.getMaxWait());
- basicDataSource.setMaxIdle(information.getMaxIdle());
+ basicDataSource.setMinIdle(information.getMinIdle());
basicDataSource.setDefaultAutoCommit(information.isDefaultAutoCommit());
basicDataSource.setDefaultReadOnly(information.isDefaultReadOnly());
basicDataSource.setTestOnBorrow(information.isTestOnBorrow());
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceInformationFactory.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceInformationFactory.java?rev=707647&r1=707646&r2=707647&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceInformationFactory.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/datasource/factory/DataSourceInformationFactory.java
Fri Oct 24 07:45:29 2008
@@ -253,7 +253,7 @@
information.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
information.setTestWhileIdle(testWhileIdle);
information.setValidationQuery(validationQuery);
- information.setMaxIdle(minIdle);
+ information.setMinIdle(minIdle);
information.setDefaultTransactionIsolation(defaultTransactionIsolation);
information.setAccessToUnderlyingConnectionAllowed(accessToUnderlyingConnectionAllowed);
information.setRemoveAbandoned(removeAbandoned);