線程池、連接池、對象池從0到1


       做互聯網研發,最早接觸使用jdbc技術,為了數據庫連接能夠復用,會用到c3p0、dbcp等數據庫連接池。應該是研

發人員最早接觸的數據庫連接池,再到httpclient http連接池,再到微服務netty連接池,redis客戶端連接池,以及jdk中線

程池技術。

       這么多數據庫、http、netty連接池,jdk線程池,本質上都是連接池技術,連接池技術核心是連接或者說創建的資源復

用。

       連接池技術核心:通過減少對於連接創建、關閉來提升性能。用於用戶后續使用,好處是后續使用不用在創建連接以

及線程,因為這些都需要相關很多文件、連接資源、操作系統內核資源支持來完成構建,會消耗大量資源,並且創建、關

閉會消耗應用程序大量性能。

 

       網絡連接本身會消耗大量內核資源,在linux系統下,網絡連接創建本身tcp/ip協議棧在內核里面,連接創建關閉會消耗

大量文件句柄(linux中萬物皆文件,一種厲害抽象手段)系統資源。當下更多是應用tcp技術完成網絡傳輸,反復打開關閉

,需要操作系統維護大量tcp協議棧狀態。

       連接池本質上是構建一個容器,容器來存儲創建好的線程、http連接、數據庫連接、netty連接等。對於使用方相當於黑

盒,按照接口進行使用就可以了。各個連接池構建、使用管理詳細過程大概分成以下三部分。

 

       第一部分:首先初始化連接池,根據設置相應參數,連接池大小、核心線程數、核心連接數等參數,初始化創建數據庫、

http、netty連接以及jdk線程。

       第二部分:連接池使用,前邊初始化好的連接池、線程池,直接從連接池、線程中取出資源即可進行使用,使用完后要

記得交還連接池、線程池,通過池容器來對資源進行管理。

       第三部分:對於連接池維護,連接池、線程池來維護連接、線程狀態,不可用連接、線程進行銷毀,正在使用連接、線

程進行狀態標注,連接、線程不夠后並且少於設置最大連接、線程數,要進行新連接、線程創建。

 

       通過上邊可以了解到各種連接池技術以及線程池原理或者說套路,理解原理才能不被紛繁復雜表象掩蓋。

       下面談談構建自己連接池,其實理解了連接池、線程原理,可以使用ArrayList來構建自己連接池、線程池。初始化時創建

配置連接數、線程,存儲在ArrayList容器中,使用時從ArrayList從取出連接、線程進行使用,執行完任務后,提交回ArrayList

容器。前提條件是單線程,在多線程狀態下要用線程安全容器。

       前邊根據原理介紹了一個簡單連接池、線程池怎樣構建,實際工業級別線程池還要考慮到連接狀態,短連接重連,線程池

維護管理高效,線程池穩定等多個因素。

 

       需要用到連接池而又沒有相關開源產品可用時,java連接池可以使用common-pool2來構建,比如google開源gRPC技術,

本身是高性能跨平台技術,但目前作為微服務使用,沒有連接池、負載均衡等相應配套,這時可以根據需要自己基於Java容器

構建自己連接池。也可以利用common-pool2構建連接池來提升應用性能,以及保持高可用。common-pool2本身不僅僅可以構

建連接池使用,還可以用來構建對象池。

 

       連接池還有一個副作用就是實現了高可用,在微服務場景下一個連接不可用,那么再從netty連接池中取出一個進行使用,

避免了連接不可用問題。

       掌握原理從比較全面掌握各種池技術,避免數據庫連接池,再到httpclient http連接池,再到微服務netty連接池,redis客戶端

連接池,以及jdk中線程池,對象池各種各樣池技術,使我們眼花繚亂,花費過多時間,掌握原理機制以不變應萬變。

       推廣一下這個方法,其他技術也是類似,深入掌握其原理,就可以明白其他類似技術相似原理,避免疲於應對各種新技術。但

每一種架構設計與實現又與領域有着關系,也不可講原理不顧實際情況擴展。理論與架構設計、源碼學習相結合才是最好的,希望

有幫助。

      掃碼關注公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM