數據連接池的基本實現

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("對不起,數據庫忙,請等會再來!!");

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章