官术网_书友最值得收藏!

2.1 為什么使用數據庫連接池

一些初學者可能會有這樣的疑問:為什么要使用數據庫連接池?一些中高級的朋友也許會問:數據庫連接池本身就是一個很簡單的東西,只是內存里放了一個存連接的池,使用的時候拿,用完了就歸還,有什么好講的,又有何意義,居然還能寫出一本書來?我曾經也有這樣的疑問,但是在寫這本書的一年時間內,我認為數據庫連接池麻雀雖小五臟俱全,了解它還是很有必要的。

如圖2-1所示,數據庫連接池存在于數據庫和用戶之間,是一種管理數據庫連接的中間件。用戶通過數據庫連接池獲取連接,從而使用數據庫的資源,并執行通用的“增刪改查”操作。

圖2-1 數據庫連接池示意圖

數據庫連接池在百度百科https://baike.baidu.com/item/數據庫連接池/1518538中的定義是:數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接,來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。

那么為什么使用數據庫連接池會明顯提高數據庫操作的性能呢?下面我們結合TCP的3次握手和4次揮手,對不使用數據庫連接池和使用數據庫連接池兩種場景分別進行介紹。

讓我們一起重溫大學歲月,那些年在學習編程語言的時候,為了讓學生能夠快速學會數據庫增刪改查操作,教材里基本上都采用不使用數據庫連接池的講解和代碼示例。經典的JDBC連接數據庫的步驟大致是這樣的:加載JDBC驅動、創建數據庫連接、創建preparedStatement、執行SQL語句、遍歷結果集、關閉資源。這樣的教科書式的流程可以通俗理解為:應用程序通過DataSource通過數據庫驅動來創建一個數據庫連接,再通過TCP進行數據庫的讀寫,最后關閉數據庫連接。

以訪問MySQL為例,執行一個SQL語句的完整TCP流程共經歷TCP三次握手建立連接、MySQL三次握手認證、SQL語句執行、MySQL關閉、TCP四次揮手關閉連接5個步驟,如圖2-2所示。

圖2-2 執行一次SQL語句的完整TCP流程

這樣的傳統方式比較適合教科書,但是卻不適合企業實際生產。它存在的主要問題列舉如下:

1)創建連接和關閉連接的過程比較耗時,并發時系統會變得很卡頓。

2)數據庫同時支持的連接總數是有限的,如果并發量很大,那么數據庫連接的總數就會被消耗光,增加數據庫的負載,新的數據庫連接請求就會失敗。這樣就會極大地浪費數據庫的資源,極易造成數據庫服務器內存溢出、宕機。

3)為了執行一條SQL,卻產生了很多我們并不關心的網絡IO。

4)應用如果頻繁地創建連接和關閉連接,會導致JVM臨時對象較多,GC頻繁。

5)頻繁關閉連接后,會出現大量TIME_WAIT的TCP狀態(在2個MSL之后關閉),這點很棘手。這個問題在第1章中已經結合實踐調優經驗詳細說明過。

6)應用的響應時間及QPS較低。

使用數據庫連接池之后,產生最直接的改變就是就是基本上除了第1次訪問的時候需要建立連接以外,之后的訪問只需復用已有的連接而不是重新建立一個。

數據庫連接池帶來的優點列舉如下:

1)資源重用更佳。由于數據庫連接得到復用,減少了大量創建和關閉連接帶來的開銷,也大量減少了內存碎片和數據庫臨時進程、線程的數量,整體系統的運行更加平穩。

2)系統調優更簡便。由于頻繁關閉連接會出現TCP大量TIME_WAIT狀態,如第1章的案例所描述的那樣,TIME_WAIT的調優非常繁瑣,使用了數據庫連接池以后,由于資源重用,大大減少了頻繁關閉連接的開銷,大大降低TIME_WAIT的出現頻率。當然,數據庫連接池也有它自己獨特的配置參數,這些參數如何調優本書后續章節會詳細介紹。

3)系統響應更快。數據庫連接池在應用初始化的過程中一般都會提前準備好一些數據庫連接,業務請求可以直接使用已經創建的連接而不需要等待創建連接的開銷。初始化數據庫連接配合資源重用,使得數據庫連接池可以大大縮短系統整體響應時間。

4)連接管理更靈活。數據庫連接池作為一款中間件,除了扮演有界緩沖的角色以外,在統一的連接管理上同樣可以做很多文章。用戶可以自行配置連接的最小數量、最大數量、最常空閑時間、獲取連接超時間、心跳檢測等。另外,用戶也可以結合新的技術趨勢,增加數據庫連接池的動態配置、監控、故障演習等一系列實用的功能。

Vlad Mihalcea在他的著作《High-Performance Java Persistence》中介紹過一個試驗,可視化顯示建立和關閉數據庫連接的累積開銷,他比較了打開和關閉4種不同的RDBMS與HikariCP數據庫連接池的1000個數據庫連接,如圖2-3所示。可以看出,使用數據庫連接池HikariCP解決方案以后連接獲取時間得到了大大的縮短。通過減少連接獲取間隔,整個事務響應時間也會縮短。

圖2-3 有無數據庫連接池HikariCP的連接建立開銷對比

綜上所述,這就是我們要在實際生產中使用數據庫連接池的理由。

主站蜘蛛池模板: 白沙| 梧州市| 延吉市| 周口市| 嘉峪关市| 新疆| 西和县| 成安县| 新巴尔虎右旗| 涟源市| 江油市| 上思县| 尉氏县| 黄山市| 闸北区| 泗洪县| 太仆寺旗| 金平| 长顺县| 蓝田县| 长沙县| 桂阳县| 徐州市| 勐海县| 马山县| 准格尔旗| 聂荣县| 平阴县| 宜君县| 阿巴嘎旗| 平顶山市| 运城市| 柘荣县| 汤阴县| 城固县| 曲麻莱县| 天镇县| 满洲里市| 石城县| 衡阳市| 永丰县|