源代码如下:
接管Connection对象,屏蔽close()方法,当调用close()时,调用释放连接对象回连接池中的函数freeConnection()
public class ConnectionHandler implements InvocationHandler{
ConnectionPool pool;
Connection conn;

public ConnectionHandler(ConnectionPool pool){
this.pool=pool;
} public Connection bind(Connection conn){
this.conn=conn;
Connection proxyConn=(Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterface(),this)
return proxyConn;
} public Object invoke(Object proxy,Mathod method,Object[] args) throws Throwable{
Object result=null;
if("close".equals(method.getName())){
this.pool.freeConnection(this.conn);
}
else{
result=mathod.invoke(this.conn,args);
}
}
public static void main(String[] args) 
{
}
}
连接池类,管理数据库连接,用完不直接关闭连接,而是放回连接池中
public class ConnectionPool{
public synchronized freeConnection(){
/**
实现将对象放回连接池,不关闭连接
*/
}
public synchronized Connection getConnection(){
try{
Connection currentConnection=null;
                           /**
                            得到一个可用的数据库连接对象
                           */
ConnectionHandler handler=new ConnectionHandler(this);//初始化代理类
return handler.bind(currentConnection);//绑定并接管返回的连接 }catch(SQLException e){return null;}
}
}
对于上面这两个片段中,我想实现的是屏蔽Connectoin的close方法,当在客户端代码中调用conn.close()方法时,调用的是freeConnection()方法。但是我有一点想不通,我每次getConnection时得到的连接对象都是实现了动态代理,即这些连接都被接管了,一旦这些connection调用close()方法时,都调用了freeConnection(),那我怎么才能真正的把它关闭呢?
能力有限,不知道我有没有把问题说清楚,请各位大侠不要见笑,帮帮忙啊!!!

解决方案 »

  1.   

    有很多现成的连接池可以用啊~~~为什么要自己写呢?
    自己写的会有各种问题,
    扩展性也不会太好用开源的改造一下吧,性能、安全什么的都会比较好
    http://jopener.com/category/database-connection-pools
      

  2.   

    我是想再实现连接池的过程中,学习java,因为我还是个初学者:)。
    再写个方法?那这方法是应该写在哪个类里呢?
    我就是有一点不清楚,当我在getConnection中用
    ConnectionHandler handler=new ConnectionHandler(this);//初始化代理类
    return handler.bind(currentConnection);//绑定并接管返回的连接
    使连接绑定后,是否每一个连接之后的close操作会调用InvocationHandler接口的invoke函数呢?
    不好意思,我属于初学者,水平有限,不知道问的问题是不是弱弱了点
      

  3.   

    再写个方法,遍历连接池,再调用close方法,一个个关闭不行吗?