天天看點

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

什麼叫連接配接池?顧名思義,連接配接池就是将應用所需的連接配接對象放在池中,每次通路時從池中擷取,使用完畢再放回池中,以達到連接配接複用的目的。連接配接池和線程池很像,都是為了減少連接配接對象在建立、銷毀連接配接過程中不必要消耗的資源。

大家接觸最多的連接配接池、大概是資料庫連接配接或者tomcat連接配接池,C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等。這些連接配接池的目的都非常的純粹,即在服務啟動的時候,預先生成若幹條連接配接,每當有請求過來,就從中取出一個,執行操作,執行完成後再放回,進而避免反複的建立和銷毀連接配接,以提升性能。

連接配接池性能對比
【進階之路】和南橘一起探索連接配接池(一)

實際在微服務中,連接配接池是非常重要的元件,因為服務間需要建立連接配接通信,通過連接配接池可以極大地提高服務間的通信性能。

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

是以,我們隻要建立多條連接配接,用一個數組維護多條連接配接就行了;如果使用一條連接配接,那麼從數組裡拿出這條連接配接,使用完再放入數組即可。當數組為空時,隻要建立新的連接配接就可以了。

具體的實作可以參考我下文實作的代碼。這個連接配接池擁有了幾個基本資料。

maxIdleConns 最大空閑連接配接數,這個值相當于線程池裡的核心線程數、與線程池不一樣的是,配置了最大空閑數後,連接配接池的連接配接将會長期保持。這個值的設定很有講究,需要結合後端服務的連接配接承載能力設定。

currentCount 目前使用數目,類似于核心線程數到最短線程數之前的這個值。

maxIdCount 最大連接配接數,代表着連接配接池的上限。

ttls 連接配接的過期時間,這個時間線程池中也有,如果連接配接都為空閑連接配接,則不會進行過期處理。

上面的代碼隻是我簡單實作了一下連接配接池,但是為了使連接配接管理服務具有最大的通用性,必須考慮多線程環境,即并發問題。在java中,有各種鎖的機制能夠解決連接配接池的并發問題。

如果設定得太大,假如設定 1000,始發叢集有 100 台機器,那麼就會建立 10w 的持久連接配接,這對後端服務的壓力可想而知。但也不能設定得太小。

如果連接配接池滿了,就會建立新的連接配接,不斷建立的新連接配接會耗光後端服務的資源。

建立立的連接配接在用完之後,有兩種選擇——連接配接池有餘量的情況會放入連接配接池,反之會直接丢棄,這種情況在瞬間很容易出現,連接配接池持續瞬間被空閑連接配接占滿(最大空閑連接配接數的叫法也由此得來),導緻新連接配接無法放回連接配接池,進而丢棄,這樣就會形成建立連接配接—用完丢棄的惡性循環,連接配接池的作用也就消失了。對于HTTP請求的連接配接池來說,所有的連接配接都退化成了短連接配接。

實際上連接配接并沒有長短之分,隻是取決于傳輸完資料後是否斷開。那麼為什麼會有長短連接配接的叫法呢?這是因為 HTTP 協定多用于 Web 中,Web 的互動方式多是一來一回的模式,這樣的應用場景下,不需要服務端推資料,是以建立連接配接後立即釋放也是完全可以的。

連接配接池的配置設定與釋放,對系統的性能有很大的影響。合理的配置設定與釋放,可以提高連接配接的複用度,進而降低建立新連接配接的開銷,同時還可以加快使用者的通路速度。

我們這個連接配接池是使用LinkedList來實作的,主要的目的是考慮到過期時間。在連結清單中,前面連接配接的持續時間一定高于後面的連接配接,也可以減少連接配接的輪循時間。

大家好,我是練習java兩年半時間的南橘,下面是我的微信,需要之前的導圖或者想互相交流經驗的小夥伴可以一起互相交流哦。
【進階之路】和南橘一起探索連接配接池(一)