1. 程式人生 > >Java自學-JDBC 資料庫連線池

Java自學-JDBC 資料庫連線池

## 資料庫連線池 與[執行緒池](http://how2j.cn/k/thread/thread-threadpool/357.html?p=43278)類似的,資料庫也有一個數據庫連線池。 不過他們的實現思路是不一樣的。 本章節講解了自定義資料庫連線池類:ConnectionPool,雖然不是很完善和健壯,但是足以幫助大家理解ConnectionPool的基本原理。 步驟 1 : **資料庫連線池原理-傳統方式** 當有多個執行緒,每個執行緒都需要連線資料庫執行SQL語句的話,那麼每個執行緒都會建立一個連線,並且在使用完畢後,關閉連線。 建立連線和關閉連線的過程也是比較消耗時間的,當多執行緒併發的時候,系統就會變得很卡頓。 同時,一個數據庫同時支援的連線總數也是有限的,如果多執行緒併發量很大,那麼資料庫連線的總數就會被消耗光,後續執行緒發起的資料庫連線就會失敗。 ![資料庫連線池原理-傳統方式](https://img-blog.csdnimg.cn/20190716173431267.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2plZGR6ZA==,size_16,color_FFFFFF,t_70) 步驟 2 : **資料庫連線池原理-使用池** 與傳統方式不同,連線池在使用之前,就會建立好一定數量的連線。 如果有任何執行緒需要使用連線,那麼就從連線池裡面**借用**,**而不是自己重新建立**. 使用完畢後,又把這個連線**歸還**給連線池供下一次或者其他執行緒使用。 倘若發生多執行緒併發情況,連線池裡的連線被**借用光了**,那麼其他執行緒就會臨時等待,直到有連線被**歸還**回來,再繼續使用。 整個過程,這些連線都**不會被關閉**,而是不斷的被迴圈使用,從而節約了啟動和關閉連線的時間。 ![資料庫連線池原理-使用池](https://img-blog.csdnimg.cn/20190716173531487.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2plZGR6ZA==,size_16,color_FFFFFF,t_70) 步驟 3 : **ConnectionPool構造方法和初始化** 1. ConnectionPool() 構造方法約定了這個連線池一共有多少連線 2. 在init() 初始化方法中,建立了size條連線。 注意,這裡不能使用try-with-resource這種自動關閉連線的方式,因為連線恰恰需要保持不關閉狀態,供後續迴圈使用 3. getConnection, 判斷是否為空,如果是空的就wait等待,否則就借用一條連接出去 4. returnConnection, 在使用完畢後,歸還這個連線到連線池,並且在歸還完畢後,呼叫notifyAll,通知那些等待的執行緒,有新的連線可以借用了。 注:連線池設計用到了多執行緒的wait和notifyAll package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class ConnectionPool {