連線池的介紹一

2021-09-02 13:03:18 字數 2693 閱讀 5435

經過最近的一些面試情況以及跟團隊成員的溝通和培訓,發現現在還有很大一部分人對連線池是什麼還不明白。今天我們就來聊聊!

因為個人覺得這部分內容還是蠻重要的!

首先我們從單個的連線講起,後面會重點考察下單連線和連線池的區別!

後續我會繼續發文然後**在大型網際網路集群專案中連線池會遇到的問題,以及對應的處理方法。

什麼是連線池?出現的原因是啥?

當應用之間需要進行資料通訊時。

首先需要建立與伺服器之間的乙個連線狀態,連線建立後會分配乙個執行緒或者程序來排程,然後完成相關解析並生成執行計畫

然後才進入執行階段,讀取必要的資料到記憶體並邏輯處理

最後才通過之前建立的連線傳送結果集給到客戶端,關掉連線並釋放資源,所以連線可以說是應用之間互動的橋梁和管道。

可惜這個橋梁的構建和銷毀,對與伺服器來說是資源消耗很大的操作,這裡會涉及到

cpu的運算,

資源的爭用,記憶體的分配,

socket

的建立等,頻繁的創

建連線和銷毀連線,對伺服器來講是不可接受的,所以在某些情況下長連線顯然比短連線更適合

(比如資料庫的查詢操作)。

這時候就出現了連線池,來對整個生命週期中連線的建立和銷毀這個環節進行優化,有了連線池,我們就能做到連線復用,維護連線物件,做分配,管理和釋放,也就能減少平均連線時間,有了連線池,同時能避免應用建立大量的連線到伺服器而引發的各種問題,通過請求排隊,來緩衝應用對伺服器的衝擊。

大家現在可以想象一下對連線池的基本操作,無非就是申請連線,從連線池中獲取連線,再執行業務處理的邏輯完成後,把連線放回到池中。

在一般情況下乙個連線池在啟動的時候我們可以會初使化幾個屬性

min連線數,

max連線數,當啟動時連線池中已建起了一部分連線,如果乙個請求獲取連線的時候發現有空閒的連線,

那麼直接可以拿來用了,

如果所有的連線都在忙,但連線池的數量還沒有達到

max連線數,

那麼不需要等待,直接申請建立乙個新的連線,用完了再把他放回去,當發現沒有空閒的連線時,

並且活躍的連線已經到達

max連線數了,

那麼這時候你只能選擇暫時等待,等待的時間取決於

block-timeout

,在這等待期間如果有連線空閒下來,

那麼你就可以拿到這個連線,

如果超出等待時間還沒有拿到連線,那麼就丟擲個拿不到連線的異常。

以上就是連線池的一些基本的邏輯,另外的功能無非就是對連線池使用狀態的監控,比如乙個連線如果空閒下來了,多久沒有使用需要被關閉,比如哪些錯誤情況下需要重新建立一下連線再放入池子,比如如何定時來驗證連線是否有效,等等。

上面我提出了連線池的

min和

max連線,需要大家注意了。因為連線池本身是無法感知伺服器運**況以及負載的,所以我們需要通過經驗和計算來合理設定相關值,這對於伺服器這間的通訊來說是非常重要的,我們應該盡量做到即能發揮出伺服器的最大能力,也能有效利用資料庫的連線資源和處理能力。

那麼我們應該怎麼設定

min和

max的值了?

如果連線池

min設定過小的話,在應用業務量突增或者啟動時,就可能短時間內產生連線風暴,這對於伺服器會產生不小的衝擊,但是如果

min值設定過大,就會出現伺服器的連線過剩的情況,

連線一方面超出空閒時間被銷毀,而銷毀後發現又小於

min連線數,

又開始建立,

結果就發生迴圈,

浪費資源浪費電。

如果連線池

max值設定過大,在極端情況下,當應用發生異常時,會導致連線數被撐到

max值,有可能導致伺服器的連線數被耗盡,或者超出伺服器的處理能力,進而導致業務受到影響。並且當連線數被撐到

max值,在獲取連線等待超時的時候,應用的執行緒池也有可能受到影響,會形成一系列的連鎖反應,乃至雪崩。

所以加在

max值是,我們需要觀察下提供服務的伺服器是否還有餘量,

如果有餘量,那麼加大也只是一種臨時的解決方法。

如果沒有餘量,那麼加大那麼只會放更多的請求到提供服務的伺服器,那麼只會讓效能變得更差。

比如:按照連線池預設的配置

max為

10,一百臺應用伺服器連線乙個處理伺服器,那麼會有

1000

個連線落到這台伺服器上

,按照乙個請求的處理時間

2ms的話,

那麼一秒鐘就能處理

500個請求,

1000

個連線的話可以處理

50w的

qps/tps

請求了,這時候就已經遠遠超出單個伺服器的容量極限了。

那麼我們把

block-timeout

的時間改長,

盡可能的提高拿到連線的概率,豈不是挺好?

嘿嘿,這樣也是不靠譜的,因為當應用併發很高的時候,大大超過連線池最大值,

block-timeout

也不能起到緩衝作用,返而會阻塞應用執行緒,大量的積壓執行緒會導致應用直接掛了。所以這個等待的時間也不是越長越好,而需要從應用的維度去評估一下,並建立好容錯機制。

通過以上分析的兩點,有心的童鞋可能已經發現了,在這裡的關鍵之處是,怎麼提高響應時間,就是怎麼提公升伺服器的處理能力,讓每個事務做到盡可能的短,這樣才能進一步做到連線得用,提高連線池的效率,進而縮知請求的時間。

自定義JDBC連線池及常用連線池介紹

如果不採用連線池技術,將導致不斷建立和銷毀資料庫connection,造成效能上的損耗.而資料庫連線池技術將在池中建立一定數量的connection,當需要connection時就從池中取出乙個,用完之後歸還給連線池,而不是將其銷毀.自定義資料庫連線池的具體步驟分析 a.定義mydatasource...

JDBC原生連線與連線池介紹

class.forname 載入資料庫連線驅動。第一種 直接註冊資料庫驅動 drivermanager.registerdriver new driver 第二種 利用反射機制間接載入資料庫驅動,class.forname com.mysql.jdbc.driver 常用 負責管理jdbc驅動程式的...

連線池與使用Tomcat的連線池

what is connection pool?看圖 1 存放connection物件的容器 2 減少連線資料庫的開銷 3 程式請求連線時,在connection pool中取連線 4 連線使用完後,放回connection pool,不釋放 5 connection pool對連線進行管理 計數 ...