Java自學-JDBC 資料庫連線池
阿新 • • 發佈:2020-08-02
## 資料庫連線池
與[執行緒池](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 {