通过连接返回的一定不是原始的连接,是一个经过处理了的连接。处理方案可以用装饰模式,或者动态代理。
动态代理实现:
package tool;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Stack;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class MyConnectionPool {
Stack conpool = new Stack();
private int poolsize =10;
private int maxpoolsize;
private int minpoolsize;
private String driver;
private String user ="test";
private String pass ="123";
private String url="jdbc:oracle:thin:@127.0.0.1:1521:ORCLWZJ";
static{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// ComboPooledDataSource ds = new ComboPooledDataSource ();
//ds.
public void init() throws SQLException{
if(conpool.size()==0){
for(int k=0;k<poolsize;k++){
Connection con2= DriverManager.getConnection(url, user, pass);
Connection c=(Connection)Proxy.newProxyInstance(MyConnectionPool.class.getClassLoader(),new Class[]{Connection.class},
new myInvocationHandler ());
conpool.push(c);
}
}
}
public Connection getConnection(){
return (Connection) conpool.pop();
}
}
-----------myInvocationHandler -----
package tool;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.Stack;
public class myInvocationHandler implements InvocationHandler {
Connection con; // 原始的
Stack conpool = new Stack();
public myInvocationHandler setConn(Connection conn) {
this.con = conn;
return this;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object returnValue = "null";
if (method.getName().equals("close")) {
conpool.push(proxy);
} else {
returnValue = method.invoke(this.con, args);
}
return returnValue;
}
}