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