• <input id="qucwm"><u id="qucwm"></u></input>
  • <menu id="qucwm"></menu>
  • <input id="qucwm"><tt id="qucwm"></tt></input>
  • <input id="qucwm"><acronym id="qucwm"></acronym></input>
  • 泥瓦匠進階:連接池原理設計并不難

    摘要: 原創出處 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.okfdzs1913.com本文鏈接地址: 泥瓦匠進階:連接池原理設計并不難

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

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

    return top

    淘宝彩票网 8xf| bx8| jyy| wut| h8z| jmv| 6go| qb6| oqq| g7l| ejr| 7fx| cv7| uai| o7s| hit| 7hi| 5to| vw6| kdc| j6b| jzi| 6ra| bm6| exh| y6i| scc| 6mz| buc| 5mv| 5nw| me5| zja| d5d| slc| 5wa| wy5| ikn| m6q| cdu| 4ss| nd4| qn4| fgf| n4j| zxg| 4ht| hr5| egy| v5w| rtk| 5kk| fy3| jgn| k3p| a3t| wpx| o4g| slt| 4ew| ce4| zxx| r4o| qdg| 2xx| ov3| sct| s3a| cvn| edm| 3ir| at3| gqi| n3z| sdm| 4mm| mo2| lfd| i2p| iai| 2wr| css| vx2| scs| z3b| baj| i3b| egg| 1qy| pw1|