1. 程式人生 > >【進階之路】和南橘一起探索連線池(一)

【進階之路】和南橘一起探索連線池(一)

### 一、連線池的定義 什麼叫連線池?顧名思義,連線池就是將應用所需的連線物件放在池中,每次訪問時從池中獲取,使用完畢再放回池中,以達到連線複用的目的。連線池和執行緒池很像,都是為了**減少連線物件在建立、銷燬連線過程中不必要消耗的資源**。 大家接觸最多的連線池、大概是資料庫連線或者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