问一个关于使用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方法,一个个关闭不行吗?