基本原理
數據庫連接池的基本原理是,事先建立一定量的數據庫連接,這些連接存放在連接池中,當java應用程序執行一個數據庫事物時,只需要從連接池中取出空閑的數據庫連接。
當java應用執行完后,再將數據庫連接放回連接池。
連接池需要考慮以下的問題
- 限制連接池中最多、可以容納的連接數目,避免過度消耗系統資源。
- 當客戶請求連接,而連接池中所有連接都已被占用時,該如何處理呢?一種方式是讓客戶一直等待一直等待,直到有空閑連接,另一種方式是為客戶分配一個新的臨時連接。
- 當客戶不在使用連接,需要把連接重新放回連接池。
- 連接池中允許處於空閑狀態的連接的最大項目。假定允許的最長空閑時間為十分鍾,並且允許空閑狀態的連接最大數目為5,
那么當連接池中有n個(n>5)連接處於空閑狀態的時間超過十分鍾時,就應該把n-5個連接關閉,並且從連接池中刪除,這樣才能更有效的利用系統資源。
線程池和數據庫連接池有相似的地方,上面的這些注意點在線程池ThreadPoolExecutor類的構造方法中都有體現
連接池實現策略
- 取出連接:如果連接池緩存不為空,就從中取出一個連接並將其返回,否則新建一個連接將其返回。
連接池的getConnection()方法返回一個連接池的代理,連接代理實現了Connection接口,但它的close()方法不會斷開數據庫連接,而是把自身放回連接池(釋放連接)。
在Invocationhandler實現類(代理對象)的invoke()方法里面加入如下關鍵代碼
if(method.getName().euqals("close")){
pool.releaseConnection((Connection)proxy)
}
- 釋放連接:如果連接池緩存未滿,就把連接放回連接池緩存,否則就關閉該連接。
- 關閉連接池:如果連接池緩存中的所有連接關閉,在清空連接池緩存。