首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

淺析資料庫連接池(一):連接建立過程、資源消耗與連接池核心原理

     編輯:DB2 教學

淺析資料庫連接池(一):連接建立過程、資源消耗與連接池核心原理

近期專案需用到連接池,引發了一個疑問:後端服務是共用一個 Connection 還是每請求建一個?連接維持多久?帶著問題,我們從底層原理層層剖析。

目錄

  • 1. 資料庫連接過程是怎樣的?
  • 2. 連接所佔用的資源有哪些?
  • 3. 連接池簡介
  • 4. 連接池的使用(下篇詳述)
  • 5. 最優連接池配置選擇(下篇詳述)

1. MySQL 連接過程深度解析

MySQL 本身是一個 Server 端程式(/etc/init.d/mysql.server)。客戶端連接有兩種方式:

  • Unix Domain Socket:本機連接,mysql -h localhost -uroot -p 或 mysql -uroot -p。不經網卡,效能更高。
  • TCP/IP:遠程或本機指定 IP,mysql -h 127.0.0.1 -uroot -p。經過網卡,可被 tcpdump 抓包。

實驗驗證:

Socket 連接無封包

Socket 連接不經網卡,tcpdump 抓不到封包。

TCP/IP 連接有封包

TCP/IP 連接可抓到完整握手封包。

MySQL 內部封裝了基於 TCP/IP 的自有協議。登入後可用 SHOW STATUS 觀察連接狀態:

  • Threads_connected:當前連接數
  • Threads_created:歷史創建連接總數
  • Threads_cached:MySQL 內部線程緩存池(預設 ~32),空閒線程不銷毀而是放入緩存,新連接優先複用,避免頻繁創建/銷毀線程開銷。

連接建立完整流程:

  1. 應用層向 DataSource 請求連接
  2. DataSource 使用 Driver 打開資料庫連接
  3. 內部創建線程、打開 TCP Socket
  4. 應用讀/寫資料庫
  5. 連接不再需要時關閉
  6. 關閉 Socket

2. 連接佔用的系統資源

  • 最大連接數限制:預設 151(可調),受系統資源制約。
  • 線程堆疊空間:每線程預設 8MB(ulimit -s),100 連接即佔 800MB 記憶體。
  • 連接緩衝區與結果緩衝區:MySQL 為每連接分配,消耗記憶體與 CPU 時間。
  • TCP 三次握手 / 四次揮手:每次連接/斷開的網路開銷,雖單次較小,但高頻下累積可觀。
  • 線程創建/銷毀開銷:核心態切換、資源分配回收,這正是線程池/連接池存在的意義。

3. 連接池核心思想與運作機制

「將資料庫連接作為物件存儲在容器中,建立後由不同請求共享複用,極大節省系統資源與時間。」

連接池原理示意圖

圖片來源網路

連接池運作六步驟

  1. 啟動時建立連接池物件
  2. 按參數創建初始空閒連接(InitialPoolSize)
  3. 請求到來:從池中取空閒連接;無空閒且未達上限(MaxPoolSize)則創建新連接
  4. 存取資料庫
  5. 關閉連接:實為歸還空閒隊列;若空閒數超過初始值則真正釋放
  6. 停止/維護時釋放連接池物件及所有連接

連接池本質上是「空間換時間」、「複用替代創建」的經典設計模式,與線程池原理異曲同工。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved