王璐
中國(guó)石油天然氣股份有限公司西南油氣田燃?xì)夥止?四川 成都 610051
數(shù)據(jù)庫(kù)連接池主要負(fù)責(zé)分配、管理與釋放數(shù)據(jù)庫(kù)連接,將數(shù)據(jù)庫(kù)連接對(duì)象儲(chǔ)存其中作為“緩沖池”,連接對(duì)象從連接池中取出供用戶使用。連接池內(nèi)部沿用連接機(jī)制,當(dāng)連接池內(nèi)的對(duì)象用完了,連接池通過(guò)控制內(nèi)部連接對(duì)象的個(gè)數(shù)來(lái)進(jìn)行調(diào)整,只有連接池內(nèi)的對(duì)象釋放完畢后,等待的用戶才能獲取連接對(duì)象,從而操作數(shù)據(jù)庫(kù)。這樣可以延長(zhǎng)連接池的使用期限,避免了數(shù)據(jù)庫(kù)頻繁的創(chuàng)建與關(guān)閉所造成的開銷。工作原理具體分為三個(gè)層面:建立、治理與關(guān)閉。
1.1.1 建立連接池。應(yīng)用程序中建立的連接池其實(shí)是靜態(tài)的。所謂靜態(tài)連接池就是指連接池中的連接在系統(tǒng)初始化時(shí)根據(jù)參數(shù)配置創(chuàng)建好數(shù)目以及確定對(duì)象放置,以便能夠在需要的時(shí)候直接從連接池中獲取,避免隨意建立和關(guān)閉造成的開銷。如java中也提供了Bean和Servlet等容器類方便構(gòu)建連接池。
1.1.2 連接池的治理。連接池的治理是整體機(jī)制的核心所在。如何在連接池建立后對(duì)其中的連接進(jìn)行治理,解決好池內(nèi)連接的建立與關(guān)閉問(wèn)題,對(duì)整個(gè)系統(tǒng)的運(yùn)行都有重大影響。對(duì)連接進(jìn)行合理分配有助于提高連接的復(fù)用率,進(jìn)而加速用戶的訪問(wèn)速度。假設(shè)連接池中分別有空閑與已分配隊(duì)列,空閑隊(duì)列用于存放未分配的連接,已分配隊(duì)列存放正在使用的連接。當(dāng)客戶請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),要首先考慮到查看連接池中是否存在空閑連接,若存在則從中取出一個(gè)分配給客戶作相應(yīng)處理。如果沒(méi)有則需要查看當(dāng)前的連接數(shù)是否已經(jīng)達(dá)到最大值,有則重新創(chuàng)建一個(gè)連接分配給客戶,沒(méi)有則需要進(jìn)行等待,假如等待時(shí)長(zhǎng)達(dá)到最大值時(shí),則向客戶反饋無(wú)空閑連接的異常信息。由此可以看出整套機(jī)制的運(yùn)行可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行有效復(fù)用,避免隨意建立和關(guān)閉造成的資源開銷。
1.1.3 連接池的關(guān)閉。連接池在應(yīng)用程序退出的同時(shí)關(guān)閉,這時(shí)就要把連接池中的連接對(duì)象全部歸還到數(shù)據(jù)庫(kù)中(也就是關(guān)閉所有的數(shù)據(jù)庫(kù)連接),整體過(guò)程與連接池的建立正好相反。
當(dāng)應(yīng)用程序退出時(shí),應(yīng)關(guān)閉連接池,此時(shí)應(yīng)把在連接池建立時(shí)向數(shù)據(jù)庫(kù)申請(qǐng)的連接對(duì)象統(tǒng)一歸還給數(shù)據(jù)庫(kù)(即關(guān)閉所有數(shù)據(jù)庫(kù)連接),這與連接池的建立正好是一個(gè)相反過(guò)程。
1.2.1 連接池的配置。為了使系統(tǒng)性能達(dá)到最佳,要合理選擇在數(shù)據(jù)庫(kù)連接池中安置連接的個(gè)數(shù),以及如何應(yīng)對(duì)連接耗盡的情況,都是需要合理的配置策略。因此給出的策略是依據(jù)整體的硬件與軟件的環(huán)境以及應(yīng)用的需求,用minConn與maxConn來(lái)表示,前者為應(yīng)用啟動(dòng)時(shí)連接池創(chuàng)建的連接數(shù),后者是連接池中的最大連接數(shù)。
1.2.2 定時(shí)檢測(cè)。使用連接池技術(shù),能夠極大地減少對(duì)數(shù)據(jù)庫(kù)連接的多余操作,在提高程序運(yùn)行效率的同時(shí)還增強(qiáng)了系統(tǒng)運(yùn)行的穩(wěn)定性。連接池通過(guò)定時(shí)對(duì)系統(tǒng)中的連接對(duì)象狀態(tài)與連接數(shù)進(jìn)行判斷繼而進(jìn)行下一步操作,實(shí)現(xiàn)了自我管理,具體可以在連接參數(shù)中增加最大空閑時(shí)間與最大使用次數(shù),增加時(shí)間參數(shù)來(lái)定時(shí),如果超過(guò)最大空閑時(shí)間,則設(shè)置無(wú)效并刪除,與此同時(shí)當(dāng)連接數(shù)小于最小連接數(shù)時(shí),則補(bǔ)充相應(yīng)的新連接。
1.2.3 并發(fā)控制。在多線程環(huán)境下,為了保證連接管理服務(wù)有較強(qiáng)的通用性,使連接管理自身數(shù)據(jù)與連接內(nèi)部的數(shù)據(jù)呈一致性。如Java語(yǔ)言自身提供了對(duì)并發(fā)管理的支持,提供關(guān)鍵字Syn2chronized以保持線程同步及安全。
1.2.4 復(fù)用連接的設(shè)計(jì)模式。該設(shè)計(jì)模式的好處在于:一是降低成本與開發(fā)時(shí)間;二是連接的對(duì)象經(jīng)過(guò)測(cè)試,可靠且穩(wěn)定;三是連接的對(duì)象在不同應(yīng)用中保持一致。在數(shù)據(jù)庫(kù)連接池中,空閑池中存放尚未分配的連接,一旦連接被分配出去,就會(huì)被放入到使用池中,當(dāng)空閑池的連接全部分配出去后,從使用池中挑選一個(gè)已經(jīng)正在使用的連接來(lái)復(fù)用。
2.1.1 需要使用到的技術(shù)及工具。設(shè)計(jì)該系統(tǒng)所需要的技術(shù)及工具主要有:一是數(shù)據(jù)庫(kù):MySQL6.62;二是開發(fā)工具Eclipse4.43;三是編程語(yǔ)言Java(版本1.74);四是UML建模;五是Socket通信;六是JDBC應(yīng)用。
2.1.2 模塊化設(shè)計(jì)。系統(tǒng)的設(shè)計(jì)具體分為以下幾大模塊:一是客戶端登錄,用戶在進(jìn)行訪問(wèn)前要事先與服務(wù)器進(jìn)行網(wǎng)絡(luò)連接,從而實(shí)現(xiàn)登錄后的實(shí)時(shí)網(wǎng)絡(luò)通信;二是服務(wù)器端管理訪問(wèn),當(dāng)有大量用戶在同一時(shí)刻進(jìn)行訪問(wèn)時(shí),需要服務(wù)器端通過(guò)數(shù)據(jù)庫(kù)連接池建立連接,從而能夠有效處理數(shù)據(jù)訪問(wèn);三是數(shù)據(jù)庫(kù)查詢,通過(guò)建立連接對(duì)數(shù)據(jù)庫(kù)連接池中的連接對(duì)象進(jìn)行查詢搜索,隨后將信息反饋給服務(wù)器端,服務(wù)器端再轉(zhuǎn)交給客戶端。
2.2.1 有連接池與沒(méi)有連接池訪問(wèn)的性能對(duì)比測(cè)試。在設(shè)計(jì)上述系統(tǒng)的過(guò)程中,出于對(duì)數(shù)據(jù)庫(kù)連接池測(cè)試的目的,對(duì)用戶的數(shù)據(jù)訪問(wèn)具體情況進(jìn)行有效的統(tǒng)計(jì)與審核,通過(guò)線性圖表的方式直觀地展示出來(lái)。將有連接池與無(wú)連接池的數(shù)據(jù)進(jìn)行比對(duì),下面假定高并發(fā)下的用戶數(shù)量為1000。有連接池的訪問(wèn)總體優(yōu)于沒(méi)有連接池的數(shù)據(jù)庫(kù)訪問(wèn),而隨連接容器中的最大連接數(shù)的增多, 數(shù)據(jù)庫(kù)的訪問(wèn)性能并不是在一直提高,而是呈現(xiàn)一種拋物線模 式,在30~40之間達(dá)到最高效率。
2.3.1 數(shù)據(jù)統(tǒng)計(jì)。本次試驗(yàn)數(shù)據(jù)采用的通過(guò)模擬1000位用戶訪問(wèn)的方法,分別對(duì)本地服務(wù)器與遠(yuǎn)程互聯(lián)網(wǎng)服務(wù)器上的設(shè)計(jì)出來(lái)的數(shù)據(jù)庫(kù)連接池做了訪問(wèn)實(shí)驗(yàn),并通過(guò)修改數(shù)據(jù)庫(kù)查詢條件(從100至1000條)得到不同情況下數(shù)據(jù)庫(kù)的性能指標(biāo)。
2.3.2 實(shí)驗(yàn)結(jié)論。通過(guò)以上實(shí)驗(yàn),我們可以得知,在高并發(fā)下的數(shù)據(jù)庫(kù)訪問(wèn)中,有連接池的訪問(wèn)效率要遠(yuǎn)高于沒(méi)有連接池(即本地連接)的訪問(wèn)效率。而數(shù)據(jù)庫(kù)連接池的訪問(wèn)效率并不會(huì)隨著容器中連接個(gè)數(shù)的增多而提升,相對(duì)的呈現(xiàn)一個(gè)單調(diào)性函數(shù),連接池的最優(yōu)連接數(shù)有一定的區(qū)域范圍性,當(dāng)連接池中的最大連接數(shù)高于或低于這個(gè)區(qū)間數(shù)值,都會(huì)造成數(shù)據(jù)庫(kù)訪問(wèn)性能的下降。該最優(yōu)區(qū)間還會(huì)隨著訪問(wèn)環(huán)境的變化而產(chǎn)生變動(dòng)。數(shù)據(jù)庫(kù)連接初始化又非常的耗費(fèi)資源,所以每當(dāng)出現(xiàn)性能問(wèn)題時(shí),僅僅加大數(shù)據(jù)庫(kù)連接池并不能起到提高性能的作用。所以這時(shí)我們就需要先將數(shù)據(jù)庫(kù)連接池的容量增大一倍,觀察是否可以解決性能問(wèn)題,如果可以的話,再依次減少數(shù)據(jù)庫(kù)連接池的值,找到性能瓶頸狀態(tài)下以及最優(yōu)性能時(shí)連接池容量的大小。通常來(lái)說(shuō),數(shù)據(jù)庫(kù)連接池的值在小于Web容器線程值,數(shù)據(jù)庫(kù)的性能會(huì)達(dá)到最優(yōu)值。
連接池的首次啟動(dòng)是在根據(jù)用戶的初始配置參數(shù)來(lái)實(shí)現(xiàn)的,這些參數(shù)可以根據(jù)多次實(shí)際測(cè)試并根據(jù)項(xiàng)目的需求來(lái)確定。因此優(yōu)化數(shù)據(jù)庫(kù)連接池的思路是在完成相關(guān)數(shù)據(jù)庫(kù)操作之后,通過(guò)動(dòng)態(tài)調(diào)整配置參數(shù)得以實(shí)現(xiàn)。那么為了保證連接池能夠快速有效的運(yùn)行,滿足各個(gè)不同時(shí)間段的需要,高峰時(shí)間段用戶訪問(wèn)量較大,為了減少資源的浪費(fèi)相對(duì)應(yīng)就要對(duì)連接池的容量進(jìn)行動(dòng)態(tài)放大;而其余時(shí)間段用戶訪問(wèn)量較小,有必要對(duì)連接池的容量適當(dāng)縮小,對(duì)可用資源進(jìn)行回收,淘汰那些不太可能會(huì)用的資源。
當(dāng)連接池啟動(dòng)時(shí),連接池的管理模塊也隨之啟動(dòng),同時(shí)在后臺(tái)以守護(hù)線程的方式運(yùn)行。其具體作用在于與連接池中獲得較優(yōu)的配置參數(shù),實(shí)時(shí)調(diào)整數(shù)據(jù)庫(kù)連接池的規(guī)模,系統(tǒng)會(huì)根據(jù)各個(gè)連接的使用時(shí)間,對(duì)下一個(gè)監(jiān)控周期進(jìn)行自主運(yùn)算。依照流程,當(dāng)時(shí)間間隔設(shè)置的很短時(shí),管理模塊頻繁的檢查連接池,當(dāng)時(shí)間間隔設(shè)置很短時(shí),管理模塊頻繁的檢查連接池,會(huì)消耗很大的系統(tǒng)資源。而如果將時(shí)間間隔定義的很長(zhǎng),則很長(zhǎng)時(shí)間才檢查一次連接池,無(wú)法達(dá)到實(shí)時(shí)監(jiān)控的效果。因此,如何設(shè)置一個(gè)合理的時(shí)間間隔,減少不必要的系統(tǒng)開銷,是實(shí)現(xiàn)連接池管理模塊的一個(gè)關(guān)鍵問(wèn)題。利用均值法得到一個(gè)較合理的時(shí)間間隔。在監(jiān)控時(shí)間到的時(shí)候,通過(guò)計(jì)算每一個(gè)連接的使用時(shí)間,得出連接使用時(shí)間的均值,并作為下一個(gè)監(jiān)控間隔。
在設(shè)計(jì)的系統(tǒng)中出現(xiàn)高并發(fā)的情況下,同一個(gè)時(shí)間段內(nèi)會(huì)有多個(gè)連接數(shù)據(jù)庫(kù)連接池的請(qǐng)求。但如果每一個(gè)請(qǐng)求都創(chuàng)建一個(gè)連接來(lái)處理,可能造成的后果是因?yàn)榫€程過(guò)多導(dǎo)致系統(tǒng)的響應(yīng)速度變慢。為了能夠在高峰時(shí)間段對(duì)服務(wù)器端線程的個(gè)數(shù)進(jìn)行有效處理,減少線程的個(gè)數(shù)與創(chuàng)建銷毀過(guò)程中帶來(lái)的系統(tǒng)開銷,特引進(jìn)線程池技術(shù)。線程池的作用有三個(gè)方面:一是降低資源消耗,通過(guò)重復(fù)利用已創(chuàng)建的線程減少造成的消耗;二是提高系統(tǒng)響應(yīng)速度,任務(wù)不需要等待創(chuàng)建即可執(zhí)行;三是提高線程的可管理性,對(duì)系統(tǒng)進(jìn)行統(tǒng)一的分配、調(diào)優(yōu)和監(jiān)控。在線程池的操作過(guò)程中,首先創(chuàng)建任務(wù)類,繼承于抽象類。在自己的任務(wù)類中重寫抽象類中的虛函數(shù)。然后創(chuàng)建該任務(wù)類的對(duì)象,通過(guò)線程池外部接口把該任務(wù)對(duì)象放到線程池任務(wù)隊(duì)列中。管理模塊會(huì)選擇自動(dòng)分配一個(gè)空閑線程處理該任務(wù),而非之前的創(chuàng)建新的線程。最終減少了創(chuàng)建與刪除線程所引起的系統(tǒng)浪費(fèi)。
隨著我國(guó)互聯(lián)網(wǎng)的迅猛發(fā)展,高并發(fā)已經(jīng)成為互聯(lián)網(wǎng)應(yīng)用的一大特點(diǎn),也成為互聯(lián)網(wǎng)應(yīng)用不可避免的問(wèn)題,尤其是在京東618、天貓雙11等高峰時(shí)段數(shù)據(jù)庫(kù)服務(wù)器時(shí)刻都在應(yīng)對(duì)大量數(shù)據(jù)請(qǐng)求。本文在高并發(fā)狀況下設(shè)計(jì)系統(tǒng),將有無(wú)連接池情況下的數(shù)據(jù)進(jìn)行分析比對(duì),隨后為數(shù)據(jù)庫(kù)連接池確定調(diào)優(yōu)策略,以期連接池達(dá)到最大性能。