趙克全
(1.同濟(jì)大學(xué) 軟件學(xué)院,上海 201804;2.亳州學(xué)院 教育系,安徽 亳州 236800)
·應(yīng)用技術(shù)研究·
大數(shù)據(jù)背景下動(dòng)態(tài)調(diào)整參數(shù)的數(shù)據(jù)庫(kù)連接池性能優(yōu)化研究
趙克全1,2
(1.同濟(jì)大學(xué) 軟件學(xué)院,上海 201804;2.亳州學(xué)院 教育系,安徽 亳州 236800)
大數(shù)據(jù)時(shí)代的數(shù)據(jù)庫(kù)連接池技術(shù)應(yīng)用廣泛。通過(guò)對(duì)數(shù)據(jù)庫(kù)連接池的用戶(hù)請(qǐng)求算法、連接池的改進(jìn)算法(連接分配策略)、動(dòng)態(tài)調(diào)整連接池算法分析比較,發(fā)現(xiàn)數(shù)據(jù)庫(kù)連接池原算法存在的問(wèn)題。通過(guò)數(shù)據(jù)庫(kù)連接訪問(wèn)的壓力測(cè)試,提出動(dòng)態(tài)調(diào)整數(shù)據(jù)庫(kù)連接池參數(shù)的解決方案。
動(dòng)態(tài)調(diào)整參數(shù);數(shù)據(jù)庫(kù)連接池;性能優(yōu)化
大數(shù)據(jù)時(shí)代不光是數(shù)據(jù)的收集整理重要,高效率使用數(shù)據(jù)更重要,數(shù)據(jù)庫(kù)連接池技術(shù)是當(dāng)前數(shù)據(jù)庫(kù)廣泛而有效使用的重要方法。
數(shù)據(jù)庫(kù)連接池是用于創(chuàng)建和管理數(shù)據(jù)庫(kù)連接的緩沖池,緩沖池中的連接可以被任何需要他們的線程使用。當(dāng)一個(gè)線程需要用ADO.NET對(duì)一個(gè)數(shù)據(jù)庫(kù)操作時(shí),將從池中請(qǐng)求一個(gè)連接。當(dāng)這個(gè)連接使用完畢后,將返回到連接池中,等待為其他的線程服務(wù)。優(yōu)化數(shù)據(jù)庫(kù)連接池可以通過(guò)對(duì)數(shù)據(jù)庫(kù)連接資源的管理來(lái)實(shí)現(xiàn),優(yōu)化連接池連接管理方式是常用的方法,它包含數(shù)據(jù)庫(kù)連接的建立、配置、分配策略等。
雖然數(shù)據(jù)庫(kù)連接池技術(shù)己經(jīng)得到了廣泛的使用,其技術(shù)也比較成熟,但連接池技術(shù)的設(shè)計(jì)方式還存在一些缺點(diǎn):連接池的參數(shù)配置策略是靜態(tài)的。靜態(tài)參數(shù)配置在參數(shù)配置表配置好連接池參數(shù)值后,參數(shù)不再更新,初始的參數(shù)配置基本上決定了連接池的性能,所以需要經(jīng)過(guò)多次的實(shí)際測(cè)試,確定連接池初始配置參數(shù)。不能根據(jù)應(yīng)用需求的變化而適時(shí)地調(diào)整參數(shù)值,有時(shí)候訪問(wèn)用戶(hù)很少,但還有大量未被分配而處于空閑狀態(tài)的連接,使得服務(wù)器的內(nèi)存和CPU資源被大量浪費(fèi)。針對(duì)這種情況,可以采用動(dòng)態(tài)調(diào)整參數(shù)的方法來(lái)改進(jìn)連接池。其基本思路是:根據(jù)用戶(hù)的需求來(lái)配置連接池參數(shù),采用基于XML格式的參數(shù)配置表;調(diào)整連接池時(shí)將信息寫(xiě)入XML格式的日志文件,根據(jù)設(shè)置的運(yùn)行日志來(lái)動(dòng)態(tài)調(diào)整連接池配置參數(shù)。該方法的特點(diǎn):能夠在并發(fā)用戶(hù)間重用連接,并隨并發(fā)壓力動(dòng)態(tài)調(diào)整連接池容量,顯著減少資源消耗,提高了資源利用率,很好地克服了靜態(tài)配置方法中存在的局限??梢栽趹?yīng)用服務(wù)器中維護(hù)該連接池,并通過(guò)它連接數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)連接池主要由兩部分組成:連接池管理和連接管理。連接池管理負(fù)責(zé)整個(gè)連接池的資源管理及調(diào)度策略管理,根據(jù)日志文件動(dòng)態(tài)調(diào)整連接池配置參數(shù),這是連接池技術(shù)的核心;連接管理實(shí)現(xiàn)連接復(fù)用,提高資源利用率,連接復(fù)用的思想是對(duì)引用次數(shù)較少的連接進(jìn)行復(fù)用。其組成結(jié)構(gòu)如圖1所示:
圖1 數(shù)據(jù)庫(kù)連接池的組成結(jié)構(gòu)
2.1 用戶(hù)請(qǐng)求算法
用戶(hù)請(qǐng)求采用優(yōu)先級(jí)算法:①用戶(hù)發(fā)出連接請(qǐng)求;②判斷是否有空閑連接,有轉(zhuǎn)向③,否則轉(zhuǎn)向④;③獲得連接,寫(xiě)入日志;④判斷連接池是否滿(mǎn),是轉(zhuǎn)向⑥,否則轉(zhuǎn)向⑤;⑤插入新連接,轉(zhuǎn)向③;⑥判斷是否有可剝奪且能夠剝奪的連接,如果有轉(zhuǎn)向⑦,否則轉(zhuǎn)向⑧;⑦剝奪可用連接,轉(zhuǎn)向③;⑧調(diào)整周期到,調(diào)用動(dòng)態(tài)調(diào)整算法,否則轉(zhuǎn)向①。具體流程如圖2所示:
圖2 請(qǐng)求算法流程
2.2 連接池的改進(jìn)算法(連接分配策略)
連接池的改進(jìn)算法(連接分配策略):①用戶(hù)申請(qǐng)連接,啟動(dòng)定時(shí)器,遍歷每個(gè)連接的狀態(tài);②如果連接關(guān)閉,轉(zhuǎn)向③,否則轉(zhuǎn)向④;③關(guān)閉連接,從連接池中刪除;④判斷連接是否空閑,如果空閑轉(zhuǎn)向⑤,否則轉(zhuǎn)向⑥;⑤判斷是否大于最大使用時(shí)間,如果是轉(zhuǎn)向③,否則轉(zhuǎn)向⑦;⑥判斷連接數(shù)是否在連接池上下限范圍之內(nèi),進(jìn)行動(dòng)態(tài)調(diào)整,轉(zhuǎn)向調(diào)整算法;⑦判斷是否大于最大使用次數(shù),如果大于轉(zhuǎn)向③,否則轉(zhuǎn)向①。具體流程如圖3所示:
圖3 改進(jìn)算法流程
2.3 動(dòng)態(tài)調(diào)整連接池算法
動(dòng)態(tài)調(diào)整連接池算法:①查看定時(shí)器,如果達(dá)到調(diào)整周期,遍歷連接池,判斷連接數(shù)是否位于最大連接數(shù)和最小連接數(shù)之間,如果位于轉(zhuǎn)向②,否則轉(zhuǎn)向③;②連接池不用進(jìn)行調(diào)整;③判斷連接數(shù)如果大于maxConn,則對(duì)連接池進(jìn)行擴(kuò)充處理;連接數(shù)小于minConn,對(duì)連接池進(jìn)行收縮處理。具體流程如圖4所示:
圖4 動(dòng)態(tài)調(diào)整算法流程
其中,對(duì)超出最大使用次數(shù)和最長(zhǎng)使用時(shí)間的連接執(zhí)行刪除操作的原因是系統(tǒng)每使用一次連接都會(huì)占用一定的內(nèi)存空間,如果一個(gè)連接使用次數(shù)過(guò)多,就使得內(nèi)存疊加區(qū)域被加大了,進(jìn)而導(dǎo)致系統(tǒng)變慢,直至死機(jī)。所以設(shè)定使用一定次數(shù),就要釋放該連接。
3.1 連接池的參數(shù)配置
連接池首次啟動(dòng)是根據(jù)用戶(hù)配置的初始參數(shù)來(lái)實(shí)現(xiàn)的,這些參數(shù)可以通過(guò)多次實(shí)際測(cè)試并根據(jù)實(shí)際項(xiàng)目的需求來(lái)確定。利用ADO.NET來(lái)構(gòu)建連接池,通過(guò)ADO.NET讀取連接池的XML配置文件,完成驅(qū)動(dòng)程序注冊(cè)和連接池初始化。
連接池改進(jìn)的思想是通過(guò)動(dòng)態(tài)調(diào)整配置參數(shù)來(lái)實(shí)現(xiàn)的,首先必須配置文件WebConfig. XML的格式如下:
<數(shù)據(jù)庫(kù)連接池>
<屬性>
…
屬性>
<連接>
<身份認(rèn)證><身份認(rèn)證>
…
連接>
數(shù)據(jù)庫(kù)連接池>
3.2 問(wèn)題分析
如何保證連接池快速有效運(yùn)行,滿(mǎn)足不同時(shí)段請(qǐng)求的需要,必須對(duì)連接池進(jìn)行動(dòng)態(tài)調(diào)整,而調(diào)整周期到了,是連接池的調(diào)整可能發(fā)生的情況。這是連接池調(diào)整的例行工作;如果有新用戶(hù)請(qǐng)求,而緩存又沒(méi)有空余資源供該請(qǐng)求使用,但緩存中有可剝奪連接且其優(yōu)先級(jí)比用戶(hù)請(qǐng)求的連接的優(yōu)先級(jí)低。
由于不同時(shí)段的訪問(wèn)量決定了對(duì)數(shù)據(jù)的存取呈曲線變化,如圖5所示。波峰時(shí)說(shuō)明用戶(hù)訪問(wèn)量較大,為了減少資源浪費(fèi),這就要求對(duì)連接池的容量進(jìn)行動(dòng)態(tài)放大;而波谷時(shí)說(shuō)明用戶(hù)訪問(wèn)量較小,則有必要對(duì)連接池容量進(jìn)行適當(dāng)縮小,并回收可用的資源,淘汰那些不再使用或者是最不可能在將來(lái)使用的資源。
圖5 訪問(wèn)量模型
調(diào)整的條件(maxConn表示最大連接數(shù);ConnTi表示在時(shí)間Ti時(shí)的訪問(wèn)量;minConn表示最小連接數(shù)):
當(dāng)minConn
圖6 連接數(shù)分析
假如Ti時(shí)刻為連接數(shù)最大峰值ConnTi,可以?。?/p>
Δc =ConnTi -Avg(maxConn)
公式(1)
Tj時(shí)刻有連接數(shù)最小值ConnTj,可以?。?/p>
Δc =Avg(minConn)-ConnTj
公式(2)
確定了Δc的取值,即確定了連接池調(diào)整的幅度,可以根據(jù)實(shí)際情況對(duì)連接池進(jìn)行動(dòng)態(tài)調(diào)整。
3.3 連接池參數(shù)動(dòng)態(tài)調(diào)整
最大連接數(shù)maxConn和最小連接數(shù)minConn的調(diào)整:
①對(duì)連接池進(jìn)行放大處理
當(dāng)用戶(hù)訪問(wèn)量過(guò)大時(shí),即當(dāng)ConnTi >maxConn時(shí),需要對(duì)連接池容量進(jìn)行適當(dāng)?shù)姆糯筇幚?,?duì)原有配置參數(shù)最大連接數(shù)maxConn進(jìn)行更新,以maxConn +Δc作為調(diào)整后的最大連接數(shù),而minConn仍為原來(lái)的值。
②對(duì)連接池進(jìn)行縮小處理
當(dāng)用戶(hù)訪問(wèn)量減少時(shí),即當(dāng)ConnTi < minConn時(shí),需要對(duì)連接池容量進(jìn)行收縮處理,對(duì)原有配置參數(shù)最小連接數(shù)minConn進(jìn)行更新,以minConn-Δc作為調(diào)整后的最小連接數(shù),而maxConn仍為原來(lái)的值。
由于連接池的調(diào)整是結(jié)合應(yīng)用服務(wù)器實(shí)現(xiàn)的,所以調(diào)整過(guò)程中其他線程的操作,都將由應(yīng)用服務(wù)器來(lái)實(shí)現(xiàn)。服務(wù)器注銷(xiāo)所有連接釋放資源時(shí)對(duì)連接池進(jìn)行分析,進(jìn)而對(duì)配置參數(shù)進(jìn)行調(diào)整。配置文件設(shè)置連接ID號(hào),ID號(hào)是根據(jù)連接申請(qǐng)的先后順序進(jìn)行配置,而寫(xiě)日志操作記錄的是連接的起始時(shí)間和終止時(shí)間,所以可以遍歷連接池中的連接,根據(jù)所求連接的終止時(shí)間和其余連接的起始時(shí)間的關(guān)系,求出該連接的并發(fā)連接數(shù),進(jìn)而求出最大并發(fā)連接數(shù)和最小并發(fā)連接數(shù),作為最大連接數(shù)和最小連接數(shù)寫(xiě)入配置文件,實(shí)現(xiàn)配置參數(shù)的更新。
連接池的改進(jìn)主要是通過(guò)寫(xiě)入日志的形式來(lái)實(shí)現(xiàn)動(dòng)態(tài)調(diào)整,在日志中記錄數(shù)據(jù)訪問(wèn)的情況,經(jīng)過(guò)設(shè)定的一段時(shí)間后日志評(píng)價(jià)的結(jié)果被寫(xiě)到連接池的配置文件中。連接池根據(jù)用戶(hù)配置的初始參數(shù)實(shí)現(xiàn)首次啟動(dòng),初始參數(shù)是通過(guò)實(shí)際測(cè)試確定下來(lái)的,以后每次連接池啟動(dòng)時(shí),通過(guò)裝入上次日志的運(yùn)行結(jié)果來(lái)動(dòng)態(tài)調(diào)整參數(shù)的值,這樣就可以有效避免連接池參數(shù)設(shè)置的盲目性。
[1] 歐陽(yáng)宏基,葛萌,趙薔.基于JDBC與設(shè)計(jì)模式的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)方法[J].計(jì)算機(jī)技術(shù)與發(fā)展,2011(1).
[2] 衣李娜. Java訪問(wèn)SQL數(shù)據(jù)庫(kù)的優(yōu)化探討[J]. 計(jì)算機(jī)光盤(pán)軟件與應(yīng)用, 2012(21).
[3] 孟培超,胡圣波,舒恒,等.基于ADO數(shù)據(jù)庫(kù)連接池優(yōu)化策略[J].計(jì)算機(jī)工程與設(shè)計(jì),2013(5).
[4] 朱子江,等. 基于ADO.NET 的數(shù)據(jù)庫(kù)連接池技術(shù)的優(yōu)化研究[J] .計(jì)算機(jī)與現(xiàn)代化,2011(7).
[5] 王國(guó)亮,安世全.一種數(shù)據(jù)庫(kù)連接池的動(dòng)態(tài)控制策略[J].重慶郵電大學(xué)學(xué)報(bào)(自然科學(xué)版),2007(8).
責(zé)任編輯:木 星
2016-12-05
趙克全(1965—),男,安徽蒙城人,副教授,同濟(jì)大學(xué)軟件學(xué)院軟件工學(xué)專(zhuān)業(yè)2013級(jí)碩士研究生,研究方向:應(yīng)用軟件研發(fā)、應(yīng)用數(shù)學(xué)。
TP301.6
A
1671-8275(2017)01-0133-03