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