日期:2014-05-16 浏览次数:20499 次
package com.emagsoftware; import java.lang.reflect.Method; import java.sql.Connection; import javax.sql.DataSource; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.BeanPostProcessor; import org.apache.log4j.Logger; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * DataSource connection监控处理 * * @author huzl * @date 2010-11-26 9:42:17 */ class DataSourceBeanPostProcessor implements BeanPostProcessor { public static Map connections = new ConcurrentHashMap(); public static Map connectionTime = new ConcurrentHashMap(); Logger log = Logger.getLogger(DataSourceBeanPostProcessor.class); public Object postProcessBeforeInitialization(Object object, String name) { return object; } //创建DataSource或DataSource工厂的代理 public Object postProcessAfterInitialization(Object object, String name) throws org.springframework.beans.BeansException { if (!"dataSource".equals(name)) return object; System.out.println("****************DataSource postProcessAfterInitialization success "); if (object instanceof FactoryBean) return createDataSourceFactoryProxy((FactoryBean) object); else return createDataSourceProxy((DataSource) object); } private FactoryBean createDataSourceFactoryProxy(final FactoryBean factoryBean) { if (Enhancer.isEnhanced(factoryBean.getClass())) return factoryBean; MethodInterceptor factoryInterceptor = new MethodInterceptor() { public java.lang.Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws java.lang.Throwable { Object result = method.invoke(factoryBean, args); if ("getObject" != method.getName()) return result; return createDataSourceProxy((DataSource) result); } }; return (FactoryBean) createProxy(FactoryBean.class, factoryInterceptor); } //拦截DataSource getConnection方法,记录获取的数据库连接 private DataSource createDataSourceProxy(final DataSource dataSource) { if (Enhancer.isEnhanced(dataSource.getClass())) return dataSource; MethodInterceptor dataSourceInterceptor = new MethodInterceptor() { public java.lang.Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws java.lang.Throwable { Object result = method.invoke(dataSource, args); if ("getConnection" != method.getName()) return result; connections.put(result, new Exception()); connectionTime.put(result, new java.util.Date()); System.out.println("****************DataSource Connection get size = " + connections.size()); return createConnectionProxy((Connection) result); } }; return (DataSource) createProxy(DataSource.class, dataSourceInterceptor); } //拦截Connection close方法,清除释放的数据库连接 private Connection createConnectionProxy(final Connection conn) { if (Enhancer.isEnhanced(conn.getClass())) return conn; MethodInterceptor connectionProxy = new MethodInterceptor() { public java.lang.Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws java.lang.Throwable { if ("close" == method.getName()) { connections.remove(conn); connectionTime.remove(conn);