⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connectionhandler.java

📁 springGather 在JAVA环境开发的电信运营支持系统
💻 JAVA
字号:
package org.adam.proxy;

import java.lang.reflect.*;
import java.sql.*;

import org.com.pool.*;

/**
* 采用了Dynamic Proxy模式来解决程序员的惯性动作---

* connection.close()---如果真正把连接关闭了,那么连接池的

* 的概念就不存在了,要做到真正重用,不是把连接关闭,而是要

* 使用完的连接重新放到池里,等待下次重用.所以,这里采用了

* 方法拦截器来实现这个connection.close()所带来的关闭连接

* 问题.当客户调用connection.close()将触发方法拦截器,这个

* 时候就可以在invoke(...)方法里进行相关操作,如---把连接

* 重新放回连接池 !---Proxy模式比Decorator模式方便多了,

* 在此便是一个好例子,^_^

* @author Adam Email: yangjh@tarena.com 

* @version 1.0.2 

* 

*/ 

public class ConnectionHandler implements InvocationHandler{
	Connection dbconn;
	TestConnectionPoolSecond pool;
	
	public ConnectionHandler(TestConnectionPoolSecond pool){
		this.pool = pool;
	}

	/**
	* 将动态代理绑定到指定的Connection

	* @param conn;
	
	* @return 绑定代理后的Connection

	*/

	public Connection bind(Connection conn){
		this.dbconn = conn;

		Connection proxyConn = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),this);

		return proxyConn;
	}

	/**
	* 方法调用拦截器
	
	* 判断当前调用的方法是否为"close"方法

	* 如果是的话,调用pool.returnConnection(Connection con)

	* 方法作为标准close方法的替代!

	*/

	public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{
		Object obj = null;
		//如果调用的是close方法,则永pool.returnConnection(Connection con)将其替换
		if("close".equals(method.getName())){
			pool.returnConnection(dbconn);
		}else{
			obj = method.invoke(dbconn,args);
		}
		return obj;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -