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;
}
}
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;
}
}
jdbcinfo.properties
# Sample ResourceBundle properties file
driver_name=com.pointbase.jdbc.jdbcUniversalDriver
db_url=jdbc:pointbase:server://localhost/Adam
user_name=PBPUBLIC
password=PBPUBLIC
initialConnections=2
incrementalConnections=5
maxConnections=10