【進階之路】和南橘一起探索連線池(一)
阿新 • • 發佈:2021-01-12
### 一、連線池的定義
什麼叫連線池?顧名思義,連線池就是將應用所需的連線物件放在池中,每次訪問時從池中獲取,使用完畢再放回池中,以達到連線複用的目的。連線池和執行緒池很像,都是為了**減少連線物件在建立、銷燬連線過程中不必要消耗的資源**。
大家接觸最多的連線池、大概是資料庫連線或者tomcat連線池,C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等。這些連線池的目的都非常的純粹,即**在服務啟動的時候,預先生成若干條連線,每當有請求過來,就從中取出一個,執行操作,執行完成後再放回,從而避免反覆的建立和銷燬連線,以提升效能**。
>連線池效能對比
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0b6c79892aa34214a2f465ee9c23c139~tplv-k3u1fbpfcp-watermark.image)
實際在微服務中,連線池是非常重要的元件,因為服務間需要建立連線通訊,通過連線池可以極大地提高服務間的通訊效能。
![一般連線池的實現,圖片來自拉鉤教育](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a4bde10cd3db48838e536080b9046265~tplv-k3u1fbpfcp-watermark.image)
因此,我們只要建立多條連線,用一個數組維護多條連線就行了;如果使用一條連線,那麼從數組裡拿出這條連線,使用完再放入陣列即可。當陣列為空時,只要建立新的連線就可以了。
### 二、自定義連線池
具體的實現可以參考我下文實現的程式碼。這個連線池擁有了幾個基本資料。
- **maxIdleConns** 最大空閒連線數,這個值相當於執行緒池裡的核心執行緒數、與執行緒池不一樣的是,配置了最大空閒數後,連線池的連線將會長期保持。這個值的設定很有講究,需要**結合後端服務的連線承載能力設定**。
- **currentCount** 當前使用數目,類似於核心執行緒數到最短執行緒數之前的這個值。
- **maxIdCount** 最大連線數,代表著連線池的上限。
- **ttls** 連線的過期時間,這個時間執行緒池中也有,如果連線都為空閒連線,則不會進行過期處理。
```
public class MyPool {
// 最大連線數
private int maxIdCount;
//記錄當前使用 的連線數目
private int currentCount ;
//初始化執行緒數、最大空閒連線數
private int maxIdleConns;
// 多久後連線會斷開,很多連線池會在一定時間後斷開連線,然後將新鮮的連線放入連線池
private int ttls;
//我們用LinkedList來定義一個連線池
private Li