JDBC连接池笔记--增强Connection对象中的close方法

1.写一个子类,覆盖close方法(由于传递的对象封装了大量的信息,不可行)

2.写一个connection的包装类,增强close方法(可以,但是有的代码量大)
3.用动态代理,返回一个代理对象出去,拦截close方法的调用,对close方法进行增强

 (可以使用BDCP或者C3P0)

--用包装设计模式对某个对象进行增强

1.写一个类,实现与被增强对象相同的接口

2.定义一个变量,指向被增强对象

3.定义一个构造方法,接受被增强对象

4.覆盖需要增强的方法

5.对于不需要增强的方法,直接调用被增强对象的方法

 

eg:

class MyConnection implements Connection {

  private Connection conn;
  private List<Connection> pool;

  public MyConnection(Connection conn, List<Connection> pool) {
    this.conn = conn;
    this.pool = pool;
  }

  @Override
  public void close() throws SQLException {
    pool.add(conn);
  }

  @Override

  不需要覆盖的直接调用原来的方法

 }

 

 --动态代理

@Override
public Connection getConnection() throws SQLException {
  if (list.size() > 0) {
    Connection conn = list.removeFirst();
    //return new MyConnection(conn, list);
    return (Connection) Proxy.newProxyInstance(JdbcPool.class.getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() {

      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(!method.getName().equals("close")){
          return method.invoke(conn, args);
        }else{
          return list.add(conn);
        }
      }
    });
   } else {
      throw new RuntimeException("DB busy");
   }
}

posted @ 2017-03-05 15:50  二强  阅读(1607)  评论(0编辑  收藏  举报