第1个回答 2012-02-09
简单来说,首先要有一个集合,这个集合保存你所有的数据库连接,还要设置一些参数,比如说最大连接是多少,最少连接是多少,空闲时间等等,这个集合就是你的连接池了。
然后你所生成的连接你还要包装一下,实现connection接口,里面至少有两个属性,一个是你连接池类,另一个是你真正得到的connection,让这个连接包装后的close方法是根据连接池最大的连接判断是直接关闭连接,还是让你的连接回到集合中
以前做连接池原理培训的时候正好写了些代码,我给你贴个代码吧
public class MyPoolConnection extends MyConnection implements Connection {
private MyConPool2 pool;
public MyPoolConnection(MyConPool2 pool, Connection con) {
super(con);
this.pool = pool;
}
/*
* 覆盖了CLOSE方法,不是将数据库连接池中的连接直接关闭,解决了直接关闭的问题
*/
public void close() throws SQLException {
pool.releaseConnection(con);
}
}
当然,更好的做法是实现一个拦截器,然后拦截close方法,代码如下:
public class MyProxyCon implements InvocationHandler {
MyProxyPool pool;
Connection con;
public MyProxyCon(MyProxyPool pool) {
this.pool = pool;
}
/*
* 作用:把动态代理绑定到指定的Connection 返回值:动态代理后的Connection
*/
public Connection bind(Connection con) {
this.con = con;
Connection proxyCon = (Connection) Proxy.newProxyInstance(con
.getClass().getClassLoader(), con.getClass().getInterfaces(),
this);
return proxyCon;
}
/*
* 作用:方法调用拦截器 返回值:代理对象 判断当前方法是否为CLOSE,如果是的话,把有关的方法动态的调用给被代理的对象
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object obj = null;
if ("close".equals(method.getName())) {
pool.releaseConnection(con);
} else {
obj = method.invoke(con, args);
}
return obj;
}
}
// 代理模式的使用范围:为了保护某些对象,把相关的权限进行了检查,//
// 在合适以后把决定要调用的方法传给被代理的对象//
// 还可以使用这个模式解决我们临时增加一些功能或者方法的时候使用。本回答被网友采纳