何平
(襄陽職業(yè)技術(shù)學(xué)院 電子信息工程學(xué)院,襄陽 441050)
在目前大多數(shù)的應(yīng)用開發(fā)過程中,人們往往側(cè)重于實(shí)現(xiàn)系統(tǒng)的功能而忽略其性能問題。J2EE多層應(yīng)用框架在提高軟件的重用性和分解問題的復(fù)雜性的同時,也使得代碼龐大,層與層之間的控制關(guān)系復(fù)雜,在性能、負(fù)載、效率、數(shù)據(jù)的一致性與組件的可擴(kuò)充性上總是存在一定的矛盾。這種不規(guī)范的開發(fā)模式和開發(fā)過程是產(chǎn)生J2EE應(yīng)用系統(tǒng)性能問題的主要因素。系統(tǒng)開發(fā)初期,對架構(gòu)模式的不合理使用,很多系統(tǒng)在設(shè)計(jì)時就已經(jīng)產(chǎn)生了性能盲區(qū),這些問題應(yīng)該在開發(fā)周期中盡早解決,但是往往得不到開發(fā)人員的重視。系統(tǒng)開發(fā)過程中,由于開發(fā)人員自身知識的局限,對各種影響性能的因素考慮不足,例如:網(wǎng)絡(luò)連接、數(shù)據(jù)庫、應(yīng)用服務(wù)器部署及代碼優(yōu)化編寫等。系統(tǒng)開發(fā)完成后,缺乏全面的性能測試及壓力測試,不能準(zhǔn)確而快速的查找性能瓶頸并及時解決,這些都嚴(yán)重影響了J2EE系統(tǒng)的性能。
隨著軟件系統(tǒng)的功能越來越多,應(yīng)用服務(wù)器的CPU使用率、內(nèi)存占用率、吞吐量、響應(yīng)時間等問題,都無疑是系統(tǒng)性能測定的重要指標(biāo)。因此針對ODPS軟件系統(tǒng)架構(gòu)中的支持多客戶端同時訪問數(shù)據(jù)庫而導(dǎo)致應(yīng)用服務(wù)器響應(yīng)時間過長甚至死機(jī)的問題,提出采用數(shù)據(jù)庫連接池技術(shù)。解決方案所涉及的工作流程示意圖,如圖1所示。
圖1 系統(tǒng)功能結(jié)構(gòu)
客戶端用戶提出請求,由Web層服務(wù)器響應(yīng),通過過濾器過濾,請求分派管理器的分派,由XML視圖綁定器進(jìn)行綁定,發(fā)送給應(yīng)用服務(wù)器業(yè)務(wù)邏輯管理者(BO Factory),BO Factory采用業(yè)務(wù)分派機(jī)制來指派處理文檔信息的業(yè)務(wù)對象(BO),再從數(shù)據(jù)庫連接池中取出連接,實(shí)現(xiàn)對相應(yīng)資源文件的訪問。
(1)Web服務(wù)器通過調(diào)用應(yīng)用服務(wù)器的邏輯,得到結(jié)構(gòu)化信息,結(jié)構(gòu)化信息中記錄了允許訪問的非結(jié)構(gòu)化信息的訪問路徑信息;
(2)Web服務(wù)器將這些允許訪問的非結(jié)構(gòu)化信息的訪問路徑信息緩存起來,然后把結(jié)構(gòu)化信息交給客戶層處理;
(3)客戶層拿到結(jié)構(gòu)化信息之后,當(dāng)需要處理非結(jié)構(gòu)化信息時,把Session信息及非結(jié)構(gòu)化信息的訪問路徑信息提交到文件訪問服務(wù);
(4)文件訪問服務(wù)將這些信息傳遞給Web服務(wù)器進(jìn)行訪問權(quán)限校驗(yàn),并將校驗(yàn)信息返回給文件訪問服務(wù);
(5)若校驗(yàn)成功,文件訪問服務(wù)到文件服務(wù)或者數(shù)據(jù)庫服務(wù)器中取得非結(jié)構(gòu)化信息,由文件訪問服務(wù)包裝成Http協(xié)議信息傳遞給客戶層用戶,反之亦然。
對數(shù)據(jù)庫連接資源的管理是提高應(yīng)用系統(tǒng)性能的有效手段,而連接池技術(shù)作為一種成熟的連接管理方式,提供了一套連接的建立、配置、分配策略。雖然數(shù)據(jù)庫連接池技術(shù)己經(jīng)得到了廣泛的使用,其技術(shù)也比較成熟,但無論是應(yīng)用服務(wù)器提供的連接池機(jī)制,還是現(xiàn)有連接池技術(shù)的設(shè)計(jì)方式,都存在這個問題:連接池的靜態(tài)的參數(shù)配置策略。在參數(shù)配置表設(shè)置連接池參數(shù)值,這些參數(shù)設(shè)置好后就不能再修改,初始的參數(shù)配置基本上決定了連接池的性能,所以需要經(jīng)過多次的實(shí)際測試,確定連接池初始配置參數(shù)。不能根據(jù)應(yīng)用需求的變化而適時地調(diào)整參數(shù)值,有時候訪問用戶很少,但還有大量未被分配而處于空閑狀態(tài)的連接,大大的浪費(fèi)了服務(wù)器的內(nèi)存和CPU資源。
針對以上分析,論文采用動態(tài)調(diào)整參數(shù)的方法來改進(jìn)連接池。其基本思路是:根據(jù)用戶的需求來配置連接池參數(shù),采用基于XML格式的參數(shù)配置表;調(diào)整連接池時將信息寫入XML格式的日志文件,根據(jù)設(shè)置的運(yùn)行日志來動態(tài)調(diào)整連接池配置參數(shù)。
數(shù)據(jù)庫連接池主要由兩部分組成:連接池管理和連接管理。連接池管理負(fù)責(zé)整個連接池的資源管理及調(diào)度策略管理,根據(jù)日志文件動態(tài)調(diào)整連接池配置參數(shù),這是連接池技術(shù)的核心;連接管理實(shí)現(xiàn)連接復(fù)用,提高資源利用率,連接復(fù)用的思想是對引用次數(shù)較少的連接進(jìn)行復(fù)用。其組成結(jié)構(gòu),如圖2所示。
圖2 數(shù)據(jù)庫連接池的組成結(jié)構(gòu)
連接池首次啟動是根據(jù)用戶配置的初始參數(shù)來實(shí)現(xiàn)的,這些參數(shù)可以通過多次實(shí)際測試并根據(jù)實(shí)際項(xiàng)目的需求來確定。利用Java中的數(shù)據(jù)結(jié)構(gòu)對象(如:Vector,Hashtable,Stack等)來構(gòu)建連接池,通過JDOM讀取連接池的XML配置文件,完成驅(qū)動程序注冊和連接池初始化。
連接池改進(jìn)的思想就是通過動態(tài)調(diào)整配置參數(shù)來實(shí)現(xiàn)的,首先必須配置文件CoonPoolConfig. XML的格式如下:
<數(shù)據(jù)庫連接池>
<屬性>
…
屬性>
<連接>
<身份認(rèn)證><身份認(rèn)證>
…
連接>
數(shù)據(jù)庫連接池>
如何保證連接池快速有效的運(yùn)行,滿足不同時段請求的需要,必須對連接池進(jìn)行動態(tài)調(diào)整,連接池的調(diào)整發(fā)生的情況可能有:調(diào)整周期到,這是連接池調(diào)整的例行工作;有新用戶請求,而緩存沒有空余資源,但有可剝奪連接且新請求的優(yōu)先級高于此可被剝奪連接的優(yōu)先級。
由于不同時段的訪問量決定了對數(shù)據(jù)的存取呈曲線變化,如圖4所示。
波峰時說明用戶訪問量較大,為了減少資源浪費(fèi),這就要求對連接池的容量進(jìn)行動態(tài)的放大;而波谷時說明用戶訪問量較小,則有必要對連接池容量進(jìn)行適當(dāng)?shù)目s小,并回收可用的資源,淘汰那些不再使用或者是最不可能在將來使用的資源。
圖4 訪問量模型圖
調(diào)整的條件(maxConn表示最大連接數(shù);ConnTi表示在時間Ti時的訪問量;minConn表示最小連接數(shù)):
當(dāng)maxConn < ConnTi< minConn時,訪問量處于正常狀態(tài),不需要調(diào)整;
當(dāng)ConnTi< minConn時,需要對連接池容量進(jìn)行收縮處理;
或者ConnTi> maxConn時,需要對連接池進(jìn)行適當(dāng)?shù)姆糯筇幚恚?/p>
用Δc表示連接池容量收縮、放大的幅度,以放大處理為例:如果Δc過大,則會造成系統(tǒng)資源浪費(fèi);如果幅度過小,則滿足不了訪問請求,需要頻繁的調(diào)整連接池容量。因此,如何合適的確定Δc的值,是動態(tài)調(diào)整的關(guān)鍵。
連接池初始參數(shù)的確定需要進(jìn)行實(shí)際應(yīng)用的模擬,進(jìn)而來選定參數(shù)值。本系統(tǒng)根據(jù)實(shí)際項(xiàng)目需求,采用壓力測試工具LoadRunner來進(jìn)行實(shí)際應(yīng)用的模擬,經(jīng)過多次測試,得出有關(guān)連接數(shù)的一系列數(shù)值,包括最大連接數(shù)、最小連接數(shù)等,通過求平均值得出平均最大連接數(shù)Avg(maxConn)和平均最小連接數(shù)Avg(minConn),作為連接池的初始配置參數(shù),如圖5所示。
圖5 連接數(shù)分析圖
假如Ti時刻為連接數(shù)最大峰值ConnTi,可以取式(1)。
Δc= ConnTi-Avg(maxConn)
(1)
Tj時刻有連接數(shù)最小值ConnTj,可以取式(2)。
Δc=Avg(minConn)-ConnTj
(2)
確定了Δc的取值,即確定了連接池調(diào)整的幅度,可以根據(jù)實(shí)際情況對連接池進(jìn)行動態(tài)調(diào)整。
(1)對連接池進(jìn)行放大處理
當(dāng)用戶訪問量過大時,即當(dāng)ConnTi> maxConn時,需要對連接池容量進(jìn)行適當(dāng)?shù)姆糯筇幚?,對原有配置參?shù)最大連接數(shù)maxConn進(jìn)行更新,以maxConn +Δc作為調(diào)整后的最大連接數(shù),而minConn仍為原來的值。
(2)對連接池進(jìn)行縮小處理
當(dāng)用戶訪問量減少時,即當(dāng)ConnTi< minConn時,需要對連接池容量進(jìn)行收縮處理,對原有配置參數(shù)最小連接數(shù)maxConn進(jìn)行更新,以maxConn-Δc作為調(diào)整后的最大連接數(shù),而minConn仍為原來的值。
由于連接池的調(diào)整是結(jié)合應(yīng)用服務(wù)器實(shí)現(xiàn)的,所以調(diào)整過程中其他線程的操作,都將由應(yīng)用服務(wù)器來實(shí)現(xiàn)。
關(guān)閉所有連接釋放驅(qū)動程序時,對連接池進(jìn)行分析,調(diào)整配置參數(shù)。配置文件設(shè)置連接ID號,ID號是根據(jù)連接申請的先后順序進(jìn)行配置,而寫日志操作記錄的是連接的起始時間和終止時間,所以可以遍歷連接池中的連接,根據(jù)所求連接的終止時間和其余連接的起始時間的關(guān)系,求出該連接的并發(fā)連接數(shù),進(jìn)而求出最大并發(fā)連接數(shù)和最小并發(fā)連接數(shù),作為最大連接數(shù)和最小連接數(shù)寫入配置文件,實(shí)現(xiàn)配置參數(shù)的更新。
連接池的改進(jìn)主要是通過寫入日志的形式來實(shí)現(xiàn)動態(tài)調(diào)整的,連接池將數(shù)據(jù)訪問的情況記錄到日志中,在一定時候把日志評價的結(jié)果寫回到連接池的配置文件中。連接池首次啟動是根據(jù)用戶配置的初始參數(shù)來實(shí)現(xiàn)的,這些參數(shù)可以通過多次實(shí)際測試來確定,以后的每次啟動時裝入上次日志的運(yùn)行結(jié)果來動態(tài)調(diào)整池參數(shù)的值,從而有效的避免了用戶盲目的設(shè)置連接池參數(shù)。
本文針對ODPS系統(tǒng)的需求,提出性能優(yōu)化的解決方案。論文取得的成果體現(xiàn)在通過日志管理獲取連接池的配置參數(shù),通過對參數(shù)的動態(tài)更新,實(shí)現(xiàn)了對連接池的動態(tài)管理,達(dá)到了更加有效的利用系統(tǒng)資源的目的。