近期專案需用到連接池,引發了一個疑問:後端服務是共用一個 Connection 還是每請求建一個?連接維持多久?帶著問題,我們從底層原理層層剖析。
MySQL 本身是一個 Server 端程式(/etc/init.d/mysql.server)。客戶端連接有兩種方式:
mysql -h localhost -uroot -p 或 mysql -uroot -p。不經網卡,效能更高。mysql -h 127.0.0.1 -uroot -p。經過網卡,可被 tcpdump 抓包。實驗驗證:

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

TCP/IP 連接可抓到完整握手封包。
MySQL 內部封裝了基於 TCP/IP 的自有協議。登入後可用 SHOW STATUS 觀察連接狀態:
Threads_connected:當前連接數Threads_created:歷史創建連接總數Threads_cached:MySQL 內部線程緩存池(預設 ~32),空閒線程不銷毀而是放入緩存,新連接優先複用,避免頻繁創建/銷毀線程開銷。連接建立完整流程:
ulimit -s),100 連接即佔 800MB 記憶體。「將資料庫連接作為物件存儲在容器中,建立後由不同請求共享複用,極大節省系統資源與時間。」

圖片來源網路
InitialPoolSize)MaxPoolSize)則創建新連接連接池本質上是「空間換時間」、「複用替代創建」的經典設計模式,與線程池原理異曲同工。