來源:北大青鳥總部 2023年02月07日 13:28
自互聯(lián)網誕生以來,不斷的產生了很多新架構、新技術、新思想,在架構層次來看,從之前的單機架構—》SOA架構— 〉微服務架構—》中臺架構;在技術層次看,從之前的物理機部署—〉虛擬機部署— 》容器部署—〉kubernets部署,算法也逐漸演變成數(shù)據庫、云計算、機器學習,移動基站建設也從2G、3G、4G、5G、6G進行演變;在設計思想上來看,從最初的瀑布式開發(fā)演變成敏捷開發(fā)、devops。所有在互聯(lián)網發(fā)生的這一切都只有一個目的,讓用戶更快的找到自己想要的東西、更快的解決問題,同時降低企業(yè)的成本。
所以對于應用程序來說,資源是非常寶貴和稀缺的,這既包含了計算資源、存儲資源、網絡資源,也包含線程池資源、數(shù)據庫連接資源。如何利用好資源、提供最好的用戶體驗成為企業(yè)最大的問題?應用程序的執(zhí)行過程往往是這樣的,用戶在瀏覽器或app發(fā)起一個請求,通過web服務器解析加載前端資源給到用戶,同時將請求發(fā)送給應用服務器處理用戶請求,在應用服務器處理時可能會調用其它業(yè)務模塊、也可能會調用遠程服務、但一定會調用數(shù)據庫,所以最重要的模塊便是數(shù)據庫,而最容易出現(xiàn)問題的地方也是數(shù)據庫,因此充分利用好數(shù)據庫資源十分重要。
在傳統(tǒng)互聯(lián)網時代,如果一個程序要訪問mysql要經過tcp的三次握手與數(shù)據庫服務器建立可靠的連接、再進行mysql用戶名和密碼認證、執(zhí)行sql語句、關閉msql、關閉tcp連接,每一次訪問數(shù)據庫都要去建立連接,然后執(zhí)行,在釋放連接。這就會讓企業(yè)和用戶不“快”。用戶不快是因為他要等很久,在這個過程中不斷的建立釋放網絡連接、不斷的訪問數(shù)據庫服務器,占據了網絡io資源,而且極可能達到數(shù)據庫服務器能處理的瓶頸,從而造成了用戶請求的等待。企業(yè)不快(樂)是因為用戶不快(速)。
在云計算時代,我們的思想是要充分的利用資源,將重復的事情抽象出來共用。在這個過程中,每個數(shù)據庫連接都需要去tcp三次握手建立連接、釋放連接,如果所有的數(shù)據庫連接都可以共享這建立連接和釋放連接的過程,那么網絡開銷、數(shù)據庫負載就會降下來了。這就是我們的數(shù)據庫連接池,它就是負責分配、管理、釋放數(shù)據庫連接的數(shù)據庫中間件,使得應用程序可以重復使用一個現(xiàn)有的數(shù)據庫連接。
數(shù)據庫連接的工作原理由三部分組成,包括連接池的建立、連接的使用管理、連接詞的關閉。 目前在市場上有商用和開源的數(shù)據庫連接池,商用的以IBM的weblogic為主,而開源的則以阿里的DBCP為主,在互聯(lián)網時代,大家都習慣了免費(雖然免費的往往是最貴的),加上開源也便于大家操作實踐,因此我們使用DBCP將理論與實際結合來介紹數(shù)據庫連接池的“最佳實踐”~
在系統(tǒng)初始化時,連接池根據系統(tǒng)配置建立并在池中創(chuàng)建幾個連接對象,需要使用的時候就從池子中獲取即可,并且不允許用戶隨意的創(chuàng)建和關閉連接,從而帶來不必要的網絡開銷(建立tcp連接和釋放連接)。
初始化時選擇JDBC(Java DataBase Connectivity,Java數(shù)據庫連接管理)驅動程序來進行數(shù)據的連接,并選擇連接的數(shù)據庫類型(mysql)、數(shù)據庫服務器(localhost:3306)、數(shù)據庫(day14),并配置對應的用戶名和密碼。
有了連接池后,對連接數(shù)需要進行分配和釋放等工作,這就是數(shù)據庫連接池的管理工作。當用戶請求數(shù)據庫連接時,系統(tǒng)會先判斷有沒有空閑的,如果有的話就分配給客戶使用;如果沒有空閑連接,系統(tǒng)會看看當前所存在的連接數(shù)是否達到了最大可用值,沒有的話就創(chuàng)建一個新的連接給到用戶;如果沒有空閑的連接也達到了最大連接數(shù),就設置一個最長等待時間,超過等待時間后告知用戶發(fā)生異常,停止等待;
當應用程序退出后,關閉掉池子中所有的連接,釋放資源即可。
其實這種“池”的思想在云計算時代特別的普遍,在一定程度上可以明顯優(yōu)化服務器應用程序的性能,提高程序執(zhí)行效率和降低系統(tǒng)資源開銷。除了數(shù)據庫連接池、線程池之外,還有內存池、對象池等。其中,對象池可以看成保存對象的容器,在進程初始化時創(chuàng)建一定數(shù)量的對象。需要時直接從池中取出一個空閑對象,用完后并不直接釋放掉對象,而是再放到對象池中以方便下一次對象請求可以直接復用。內存池也是如此的思想。池技術的優(yōu)勢是,可以消除應用程序創(chuàng)建所帶來的延遲,從而提高系統(tǒng)的性能,讓用戶更快的找到自己想要的東西、更快的解決問題、更快樂。
這其實和我們生活中取快遞的場景很像。當遇上618或雙十一這樣的大促時,仿佛每個人都積蓄了洪荒之力一樣頃刻之間要把需要的、不需要的、想買的、不想買的全都買了,反正就是一個字,買。那買了東西,就會有物流公司和快遞小哥給你送過來啊。你購買的是不同平臺不同商家的不同商品,那么不同的發(fā)貨時間不同的快遞公司不同的取件時間也是非常正常的現(xiàn)象,就會出現(xiàn)這樣的場景,每來一個快遞,你就得下樓去取一趟然后再回到寢室,而快遞小哥也是得等每個快遞都被人取了才算完成任務,運氣好點吧,能一次多取幾個,運氣不好的話只能一次取一個,這樣你很不快(速)取到自己的所有包裹,你自然也不(快)樂。
但是人類是聰明的,不怕困難,迎難而上。在很多學校里都會有這樣的一個收貨點的存在,快遞小哥把快件放到收貨點就走了,你根據自己合適的時間去收貨點取快遞,通過這個收貨點,將之前每次送快遞與取快遞的過程抽象為只要一次即可,這樣你很快(速)取到自己的所有包裹,你自然也很(快)樂。
至此,相信大家已經完全掌握了數(shù)據庫連接池這個知識點了吧~