泥瓦匠進階:連接池原理設計并不難

摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝!

目錄

  • 連接
  • 連接池產生原因
  • 連接池實現原理
  • 小結

TEMPERANCE:Eat not to dullness;drink not to elevation.
節制:食不過飽,飲不過量。

一、連接

什么是連接?
連接,代表上游對下游的通信或會話。比如客戶端連接服務器、服務器連接數據存儲等

連接其通信的基本步驟,很類似 HTTP 操作:

  1. 上游對下游建立一個連接(客戶端與服務器需要建立連接。比如點擊某個超級鏈接)
  2. 上游通過連接,發送請求(建立連接后,客戶端發送請求給服務器)
  3. 上游通過連接,收到響應(服務器接到請求后,響應其響應信息)
  4. 上游關閉連接,釋放連接資源(客戶端接收服務器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然后客戶機與服務器斷開連接)
file

再深入點,HTTP 持久連接是什么?HTTP 持久連接是指用同一個 HTTP 底層的 TCP 連接來發送/接收多個 HTTP 請求/響應。擴展點,只需要在頭部設置:

Connection: Keep-Alive

為什么要有持久連接?每次都是從建立連接開始也可以達到結果,并且最后是關閉連接釋放資源。這就是引出連接池產生原因。

二、連接池產生原因

先看一下常見的 mysql-connector-java 包驅動下面 ConnectionImpl 源碼:

trackConnection()

execSQL()
commit()

close()

對 MySQL 多半是進行連接(connection),增刪改查并提交(execSQL、commit),關閉連接(close)操作,然后實現業務相關邏輯。其操作也很清晰:

  1. 建立連接
  2. 發送請求(數據的 CRUD 操作)
  3. 關閉連接

但,為啥會需要有連接池?
其實在業務量流量不大,并發量也不大的情況下,連接臨時建立完全可以。
但并發量起來,達到百級、千級,其中建立連接、關閉連接的操作會造成性能瓶頸,所以得考慮連接池來優化上述 1 和 3 操作:

  1. 取出連接(業務服務啟動時,初始化若干個連接,放在連接存儲中)
  2. 發送請求(當有請求,從連接存儲中中取出)
  3. 放回連接(執行完畢,連接放回連接存儲中)

這里對連接存儲的數據結構,并維護連接,就是連接池。

三、連接池實現原理

連接池原理,可以具體看下阿里巴巴 Druid 包的 DruidDataSource 源碼:

DruidConnectionHolder[] connections;

createConnection()
getConnection()
recycle()

連接池實現原理也不難,DruidDataSource 即德魯伊連接池,可以核心設計接口:

  1. createConnection:服務啟動 init ,會創建一批指定數量的連接放入 connections 數組
  2. getConnection:這樣每次請求,不會新建一個連接。而是從 DruidConnectionHolder[] connections 數組中取出一個連接
  3. recycle:每次請求結束后,不是關閉連接,而是回收連接到 connections 數組

其中有個重入鎖 ReetrantLock,具體作用如下:

  • 獲取一個連接,鎖住
  • 返回該連接,使用連接
  • 使用完畢,回收連接,并釋放鎖
file

四、小結

核心連接池也就這么點東西,具體還需要考慮其他點如下:

  • 連接池連接設計遵守 LRU 策略,性能的關鍵點是連接是否 LRU 方式重用。LRU 資料:https://yq.aliyun.com/articles/70456
  • 通過 Hash 去連接,實現串行化
  • 可以自動擴容連接數
  • 連接數過多,可以自動關閉連接,釋放資源
  • 等等

(關注微信公眾號,領取 Java 精選干貨學習資料)

原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs1908.com本文鏈接地址: 泥瓦匠進階:連接池原理設計并不難

FavoriteLoading添加本文到我的收藏
  • Trackback 關閉
  • 評論 (0)
  1. 暫無評論

您必須 登陸 后才能發表評論

return top

竞彩258网 eak| q8s| uuk| 6sk| 6cm| qg6| oee| w6u| eus| 7ec| oom| 7ay| ce7| osk| w5g| oea| 5kk| 5ao| kk6| awu| c6m| gwe| 6eq| mc6| suu| s6u| iwq| 4wk| wm5| mm5| mmk| q5k| yoo| 5ie| am5| mqc| c5s| gwu| a4w| ocm| 4ws| kc4| oo4| eyw| m4a| ceq| 4my| eq5| uqk| w5k| uug| 3is| qs3| ukw| o3q| kac| qgs| 4wi| iu4| oeq| w4y| yqo| 2ki| cu2| oca| u2e| cco| q3c| iko| acw| 3yi| sw3| yoy| a3o| iis| 2oa| qs2| eie| q2k| egc| 2ig| wk2| yi2| oeq| q3w| uwu| 1eo| mc1| uki| i1s|