經過最近的一些面試情況以及跟團隊成員的溝通和培訓,發現現在還有很大一部分人對連線池是什麼還不明白。今天我們就來聊聊!
因為個人覺得這部分內容還是蠻重要的!
首先我們從單個的連線講起,後面會重點考察下單連線和連線池的區別!
後續我會繼續發文然後**在大型網際網路集群專案中連線池會遇到的問題,以及對應的處理方法。
什麼是連線池?出現的原因是啥?
當應用之間需要進行資料通訊時。
首先需要建立與伺服器之間的乙個連線狀態,連線建立後會分配乙個執行緒或者程序來排程,然後完成相關解析並生成執行計畫
然後才進入執行階段,讀取必要的資料到記憶體並邏輯處理
最後才通過之前建立的連線傳送結果集給到客戶端,關掉連線並釋放資源,所以連線可以說是應用之間互動的橋梁和管道。
可惜這個橋梁的構建和銷毀,對與伺服器來說是資源消耗很大的操作,這裡會涉及到
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對連線進行管理 計數 ...