1、 實現途徑:
編寫JdbcPool implements java.sql.DataSource類
l 靜態初始化塊
l getConnection()
l release()
總結:
可以解決連接池的實現問題,但是必須要求編程人員熟悉JdbcPool的使用
解決此問題的方法——增強Connection的功能
2、 方案列表:
1) 編寫Connection的子類,此方法理論上可以解決,但是沒有可操作性,因爲基本無法實現對Connection對象的初始化工作
2) 採用裝飾模式
裝飾模式解決方案
用包裝設計模式對connnction的close方法進行增強
1.寫一個類實現與被增強對象相同的接口
2.在類中定義一個變量記住被增強對象
3.在類中定義一個構造函數,接收被增強對象
4.覆蓋想增強的方法
5.對於不想增強的方法,直接調用目標對象(被增強對象)的方法
總結:
裝飾模式可以很好的解決問題,但是在此任然不合適,因爲Connection接口中定義了太多的方法,逐個去實現非常繁瑣。
3) 動態代理技術實現
public Connection getConnection() throws SQLException { if(list.size()>0){ final Connection conn = list.removeFirst(); //mysql System.out.println("用戶從池中拿走了:" + conn); System.out.println("池的大小爲" + list.size()); //myconnection preparedstatement commit close return (Connection)Proxy.newProxyInstance(JdbcPool.class.getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(!method.getName().equalsIgnoreCase("close")){ return method.invoke(conn, args); } System.out.println(conn + "被還到池中了"); list.add(conn); System.out.println("池的大小爲" + list.size()); return null; } }); /* MyConnection myconn = new MyConnection(conn,list); return myconn; // conn = pool.getConnection(); conn.preparedstatment conn */ }else{ throw new RuntimeException("對不起,數據庫忙,請等會再來!!"); } } |