目錄java
TEMPERANCE:Eat not to dullness;drink not to elevation.
節制:食不過飽,飲不過量。mysql
什麼是鏈接?
鏈接,表明上游對下游的通訊或會話。好比客戶端鏈接服務器、服務器鏈接數據存儲等sql
鏈接其通訊的基本步驟,很相似 HTTP 操做:數組
再深刻點,HTTP 持久鏈接是什麼?HTTP 持久鏈接是指用同一個 HTTP 底層的 TCP 鏈接來發送/接收多個 HTTP 請求/響應。擴展點,只須要在頭部設置:瀏覽器
Connection: Keep-Alive
爲何要有持久鏈接?每次都是從創建鏈接開始也能夠達到結果,而且最後是關閉鏈接釋放資源。這就是引出鏈接池產生緣由。服務器
先看一下常見的 mysql-connector-java 包驅動下面 ConnectionImpl
源碼:微信
trackConnection() execSQL() commit() close()
對 MySQL 多半是進行鏈接(connection),增刪改查並提交(execSQL、commit),關閉鏈接(close)操做,而後實現業務相關邏輯。其操做也很清晰:數據結構
但,爲啥會須要有鏈接池?
其實在業務量流量不大,併發量也不大的狀況下,鏈接臨時創建徹底能夠。
但併發量起來,達到百級、千級,其中創建鏈接、關閉鏈接的操做會形成性能瓶頸,因此得考慮鏈接池來優化上述 1 和 3 操做:併發
這裏對鏈接存儲的數據結構,並維護鏈接,就是鏈接池。socket
鏈接池原理,能夠具體看下阿里巴巴 Druid 包的 DruidDataSource
源碼:
DruidConnectionHolder[] connections; createConnection() getConnection() recycle()
鏈接池實現原理也不難,DruidDataSource 即德魯伊鏈接池,能夠核心設計接口:
其中有個重入鎖 ReetrantLock,具體做用以下:
核心鏈接池也就這麼點東西,具體還須要考慮其餘點以下: