JDBC以及相关技术学习(十)----拦截Connection的close方法
2013-04-19 21:50
519 查看
上一节的例子中,可能存在用户调用Connection后,直接调用close 的方法进行关闭,我们重新实现一个Connection,然后重新写close方法,代码如下:
public class MyConnection implements Connection {
//写这个类的目的是为了拦截Close方法 //类的组合
private Connection realConnection;//注意,我们是拦截close方法,对于其他方法,我们还是要用真实的Connection处理
private MyDataSource2 dataSource;
private int currentUserCount = 0;
public MyConnection(Connection realConnection,MyDataSource2 dataSource) {
this.realConnection = realConnection;
this.dataSource = dataSource;
// TODO Auto-generated constructor stub
}
@Override
public void clearWarnings() throws SQLException {
// TODO Auto-generated method stub
realConnection.clearWarnings();
}
@Override
public void close() throws SQLException {
// TODO Auto-generated method stub
this.dataSource.connectionsPool.add(this);//注意这里不能放realConnection,否则下次又自动关闭了
}
@Override
public void commit() throws SQLException {
// TODO Auto-generated method stub
realConnection.commit();
}
@Override
public Array createArrayOf(String typeName, Object[] elements)
throws SQLException {
return realConnection.createArrayOf(typeName, elements);
// TODO Auto-generated method stub
}
}
当然,这样要实现大量的代码,包括Connection的其他方法我们都要处理,现在换一种更简洁的方法,就是使用动态代理。
public class MyConnectionHandler implements InvocationHandler {
private Connection realConnection;
private Connection warpedConnection;
private MyDataSource2 dataSource;
MyConnectionHandler(MyDataSource2 dataSource){
this.dataSource = dataSource;
}
Connection bind(Connection realConn){
this.realConnection = realConn;
//Proxy可以理解为一个程序员,也会写代码,不过要告诉他怎么去写
Connection warpedConnection
= (Connection)Proxy.newProxyInstance(
this.getClass().getClassLoader(),
new Class[]{Connection.class},//接口可以很多个
this//调用处理器
);
this.warpedConnection = warpedConnection;
return warpedConnection;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("close".equals(method.getName())){
dataSource.free(warpedConnection);
}
return method.invoke(realConnection, args);
}
}
MyConnectionHandler 类相当于对Connection进行重新包装,把close()拦截了。
public class MyConnection implements Connection {
//写这个类的目的是为了拦截Close方法 //类的组合
private Connection realConnection;//注意,我们是拦截close方法,对于其他方法,我们还是要用真实的Connection处理
private MyDataSource2 dataSource;
private int currentUserCount = 0;
public MyConnection(Connection realConnection,MyDataSource2 dataSource) {
this.realConnection = realConnection;
this.dataSource = dataSource;
// TODO Auto-generated constructor stub
}
@Override
public void clearWarnings() throws SQLException {
// TODO Auto-generated method stub
realConnection.clearWarnings();
}
@Override
public void close() throws SQLException {
// TODO Auto-generated method stub
this.dataSource.connectionsPool.add(this);//注意这里不能放realConnection,否则下次又自动关闭了
}
@Override
public void commit() throws SQLException {
// TODO Auto-generated method stub
realConnection.commit();
}
@Override
public Array createArrayOf(String typeName, Object[] elements)
throws SQLException {
return realConnection.createArrayOf(typeName, elements);
// TODO Auto-generated method stub
}
}
当然,这样要实现大量的代码,包括Connection的其他方法我们都要处理,现在换一种更简洁的方法,就是使用动态代理。
public class MyConnectionHandler implements InvocationHandler {
private Connection realConnection;
private Connection warpedConnection;
private MyDataSource2 dataSource;
MyConnectionHandler(MyDataSource2 dataSource){
this.dataSource = dataSource;
}
Connection bind(Connection realConn){
this.realConnection = realConn;
//Proxy可以理解为一个程序员,也会写代码,不过要告诉他怎么去写
Connection warpedConnection
= (Connection)Proxy.newProxyInstance(
this.getClass().getClassLoader(),
new Class[]{Connection.class},//接口可以很多个
this//调用处理器
);
this.warpedConnection = warpedConnection;
return warpedConnection;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("close".equals(method.getName())){
dataSource.free(warpedConnection);
}
return method.invoke(realConnection, args);
}
}
MyConnectionHandler 类相当于对Connection进行重新包装,把close()拦截了。
相关文章推荐
- JDBC以及相关技术学习(一)----第一个JDBC程序
- JDBC以及相关技术学习(六)----批量SQL处理
- JDBC以及相关技术学习(五)----PreparedStatement特殊参数处理
- JDBC以及相关技术学习(八)----JDBC元数据
- JDBC以及相关技术学习(七)----事务机制与保存点
- JDBC以及相关技术学习(四)----运载SQL进行查询交通工具Statement
- JDBC以及相关技术学习(二)----把JDBC获取连接封装成一个工具类
- JDBC以及相关技术学习(九)----简单的连接池实现
- JDBC以及相关技术学习(三)----运载查询结果的利器ResultSet
- Python基础语法学习--元祖和字典以及相关操作和方法
- Google print相关技术以及下载方法
- 实习结束了,临走还捞了一票...和Jason聊了许多关于以后在校园技术实践以及学习的方法,宝贵经验,记录下来。
- ActiveRecord::ConnectionAdapters::TableDefinition | column相关方法学习笔记
- Docker+ K8S 学习(一):Docker 介绍以及其相关术语、底层原理和技术
- android视图学习---Android中View绘制流程以及invalidate()等相关方法分析
- Java代理模式学习---完成一个数据库连接池中的close方法拦截
- [JDBC]数据库连接池拦截close的方法/代理模式关闭连接
- 区块链相关技术学习总结(1)——区块链以及区块链技术入门详解
- JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术
- 探讨程序员如何学习你不熟悉的技术,以及用什么样的方法去学习.