日期:2014-05-20  浏览次数:20742 次

问一个关于使用JAVA中的动态代理实现数据库连接池的问题
源代码如下:
接管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(),那我怎么才能真正的把它关闭呢?
能力有限,不知道我有没有把问题说清楚,请各位大侠不要见笑,帮帮忙啊!!!

------解决方案--------------------
再写个方法,实现连接的真正关闭不就行了
------解决方案--------------------
有很多现成的连接池可以用啊~~~为什么要自己写呢?
自己写的会有各种问题,
扩展性也不会太好

用开源的改造一下吧,性能、安全什么的都会比较好
http://jopener.com/category/database-connection-pools
------解决方案--------------------
我是想再实现连接池的过程中,学习java,因为我还是个初学者:)。
再写个方法?那这方法是应该写在哪个类里呢?
我就是有一点不清楚,当我在getConnection中用
ConnectionHandler handler=new ConnectionHandler(this);//初始化代理类
return handler.bind(currentConnection);//绑定并接管返回的连接
使连接绑定后,是否每一个连接之后的close操作会调用InvocationHandler接口的invoke函数呢?
不好意思,我属于初学者,水平有限,不知道问的问题是不是弱弱了点。。。
------解决方案--------------------
再写个方法,遍历连接池,再调用close方法,一个个关闭不行吗?