◆程俊波
(西安石油大學計算機學院 陜西 710065)
基于java多線程的實時數據庫系統(tǒng)
◆程俊波
(西安石油大學計算機學院 陜西 710065)
為了滿足實時數據庫系統(tǒng)中多種操作并發(fā)執(zhí)行的需求,采用了多線程設計模式設計了實時數據庫系統(tǒng)構架,利用java語言中多線程技術特性實現了多種任務的并發(fā)處理。多線程技術提高了程序的實時響應能力,改進程序的設計結構,更有效地發(fā)揮處理器的功能,減少對系統(tǒng)資源的頻繁調度和切換。同時,增強了實時數據庫系統(tǒng)的并行處理能力,改善了客戶的交互響應時間,提高了實時數據庫系統(tǒng)的整體性能。
多線程;實時數據庫;并發(fā)處理;線程池
隨著社會和計算機科學的發(fā)展,許多企業(yè)要求以“及時方式”(即按所要求的時間)處理并管理大量的共享信息。這就要求維護大量的數據和應用的實時性,應用之間及數據與應用之間帶有時間語義的彼此依賴關系。因此,產生了實時數據庫系統(tǒng)[1]。實時數據庫系統(tǒng)需要完成對實時數據的各種操作:如實時數據處理、歷史數據存儲、統(tǒng)計數據處理、報警處理、事件處理、數據服務請求處理等。既需要數據庫技術來支持大量數據的共享,維護其數據的一致性,又需要實時處理技術來支持其任務與數據的定時限制的實現。針對以上多種事件并發(fā)處理,多個客戶端并發(fā)訪問,實時數據庫系統(tǒng)的并發(fā)控制與性能問題成為需要解決的緊迫問題。多線程程序設計是指單個程序中使用多個線程,這些線程在同一時間并發(fā)運行,執(zhí)行不同的任務[2]。用多個線程同時為多個客戶端提供服務是提高服務器并發(fā)性能的最常用手段。并且,java線程池技術已經越來越多地被應用到服務器中,在一定程度上緩解了系統(tǒng)的壓力
1.1 實時數據庫系統(tǒng)的功能需求
實時數據庫系統(tǒng)由1個主線程和5個線程組組成,它們分別是主控線程(MainThread)、OPC通訊線程組(OPCComThreadGroup)、Dtag計算線程組(DtagCalcThreadGroup)、事件計算線程組(EventCalcThreadGroup)、組播線程組(MultiCastThreadGroup)[3]、處理客戶端請求線程組(RequestProThreadGroup)。
主控線程負責初始化運行時的內存對象;OPC通訊線程組負責采集數據;Dtag計算線程組負責計算Dgroup中Dtag的值;事件計算線程組負責處理事件;組播線程組(MultiCastThreadGroup)負責將組播隊列中的組播包組播給客戶端;處理客戶端請求線程組負責對客戶端的請求進行響應處理。
1.2 實時數據庫系統(tǒng)架構
圖1 實時數據庫系統(tǒng)架構
路徑1:OPC通訊線程組首先建立異步通訊,然后定期輪詢實時數據,發(fā)現有數據更新就會復制tag點的實時值和時間戳,并計算報警。接下來,組播線程組從數據區(qū)取出數據和報警記錄,最后組播給客戶端。
路徑2:Dtag計算線程組首先比較每個DGroup的周期和當前時間,獲得到期的DGroup并計算Dtag點的值和報警。然后由組播線程組將其組播給客戶端。
路徑3:事件計算線程組首先比較每個Event的周期和當前時間,獲得到期的Event,然后執(zhí)行Event腳本。
路徑4:處理客戶端請求線程組同步處理客戶端的請求。其中包含請求有7種:客戶端登錄、客戶端注銷、全組播、讀TIDs、寫TIDs、讀取時間范圍的報警記錄、報警確認記錄。
2.1 總控線程
主控線程是控制5個線程組的總控制器,它也是管理其他5個線程組的父線程組。總控線程中的最大子線程額度為N,所以5個線程組的總子線程數量的和不能超過N。每個線程組也中各有一個額度(線程組中可以同時活動的最大線程數量),分別用sign1,sign2,...,sign5來表示5個線程組中的子線程額度,即(N >= sign1+sign2+sign3+sign4+sign5)。
主控線程基于各個線程組的歷史吞吐量(在一個整體時間內盡可能多地執(zhí)行完任務,或者盡可能多地發(fā)出請求并響應)、任務隊列大小和任務對象類型,自動增減并發(fā)的子線程數量,調整線程池的容量,能夠最大化線程池的吞吐量[4]。吞吐量(TPS)是在系統(tǒng)運行穩(wěn)定后,主控線程計算單位時間內各個線程組的完成的任務數,單位:個數/s。主控線程動態(tài)的根據時間段內各個線程組的吞吐量來調整每個線程組的額度大小。
2.2 線程組內架構的實現
實時數據庫系統(tǒng)服務器應用程序中經常出現單個任務處理的時間很短而請求的數目卻是巨大的。每當一個請求到達就創(chuàng)建一個新線程,然后在新線程中為請求服務。那么為每個請求創(chuàng)建一個新線程的開銷很大,在一個 JVM 里創(chuàng)建太多的線程可能會導致系統(tǒng)由于過度消耗內存而用完內存或“切換過度”。
線程池恰恰能夠解決以上問題,父線程用于創(chuàng)建并管理線程池,任務隊列用于存放沒有處理的任務,提供一種緩沖機制[5]。線程池在還沒有任務到來之前,預先創(chuàng)建一定數量的子線程,放入空閑隊列中。這些線程都是處于睡眠(Sleep)狀態(tài),不消耗CPU,但占用較小的內存空間。
外部因素觸發(fā)產生任務,任務的創(chuàng)建通過new操作,動態(tài)的創(chuàng)建具體的任務對象,然后添加任務對象到任務隊列中,隊列頭head+1,任務隊列可以為無限大。同時,外部因素喚醒了父線程,父線程便會分配任務給一個空閑子線程,即啟動空閑子線程,把任務傳入此線程中運行,進行處理,任務隊列的頭head-1。子線程獲取到任務后,信號量sign-1。子線程執(zhí)行完任務后信號量sign+1。當預先創(chuàng)建的線程都處于運行(Run)狀態(tài),即預制線程不夠,線程池可以自由創(chuàng)建一定數量的新線程,用于處理更多的請求,但是總的子線程數不能超過線程組的額度(sign)。當系統(tǒng)比較空閑時,大部分線程都一直處于掛起(Suspend)狀態(tài),線程池自動銷毀一部分線程,回收系統(tǒng)資源[6]。
2.3 線程組內調度算法
父線程首先初始化線程運行時的內存對象,然后處于等待狀態(tài)。當有外部因素或者其他子線程完成任務后,會喚醒父線程,父線程在分配任務給子線程之前,要檢查線程組的額度是否為0(if sign==0),如果額度不為0,則分配任務給子線程,否則,等待有空閑線程后才能分配任務,然后自己掛起,等待再次被喚醒。子線程被喚醒之后執(zhí)行任務,執(zhí)行完任務后喚醒其他組的父線程并掛起,等待下次喚醒。
父線程可以為子線程動態(tài)的設置優(yōu)先級,保證緊急任務盡早處理完成。父線程在靜態(tài)優(yōu)先級的基礎上,根據線程組的吞吐量以及某些特定條件動態(tài)的提高或者降低子線程的優(yōu)先級。從而使得高優(yōu)先級的子線程能夠優(yōu)先得到處理器的執(zhí)行[7]。
2.4 線程間的協作
OPCServer與實時數據庫系統(tǒng)建立異步通訊,當有實時數據更新時,OPCServer會喚醒OPC通訊線程組對數據進行及時處理,OPC通訊線程對數據進行處理之后喚醒組播線程組,同時也喚醒Dtag計算線程組,Dtag計算線程組對DGroup中的派生點進行計算后將數值給組播線程組,最后由組播線程組通過UDP協議將數據和報警記錄組播給客戶端[8]。
數據區(qū)是共享資源區(qū),需要線程同步對數據區(qū)進行保護,Event計算線程組會定時輪詢事件,如果數據區(qū)的數據滿足事件條件表達式,就會喚醒Event計算線程組來處理事件,事件一般是往硬件物理地址讀寫數據,此時會觸發(fā)硬件物理驅動。
客戶端通過TCP協議與服務器進行互動,服務器會根據客戶端的不同請求返回不同的響應[9]。
基于java多線程編程技術實現了實時數據庫系統(tǒng),解決處理器單元內多個線程執(zhí)行的問題,顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力[10]。其中,java線程池的并發(fā)執(zhí)行多個任務而對線程高效的并發(fā)控制策略有效的提高了實時數據庫系統(tǒng)的并行處理能力,改善了交互響應時間,提高了實時數據庫系統(tǒng)的整體性能。接下來,要致力于整個系統(tǒng)中線程間的同步研究,設計出完善的同步機制。
[1]鄭阿奇,劉啟芬,顧韻華.SQL Server 2000實用教程[M].北京:電子工業(yè)出版,2002.
[2]閃四清.SQL Server 2000簡明教程[M].北京:清華大學出版社.2003.
[3]文家焱,施平安.數據庫系統(tǒng)原理與應用[M].北京:冶金工業(yè)出版社,2002.
[4]高榮芳,張曉濱,趙安科.數據庫原理[M] 西安電子科技大學出版社,2003.
[5]李國彬,趙麗娟,沈淑清.SQL Server 2000應用基礎與實訓教程[M].電子科技大學出版社,2004.
而在login.js文件中創(chuàng)建顯示驗證碼和刷新驗證碼的方法用于后期在網頁模板中的js函數調用。
2.2 在網頁模板中加載PHP文件輸出驗證碼
要在網頁上顯示驗證碼只需要在頁面加載過程中調用上述產生的兩個js函數即可,在頁面載入后顯示隨機驗證碼,點擊“換一張”鏈接可以實現驗證碼的刷新顯示。實現效果如圖2所示。
圖2 效果圖
網站的安全問題是網民們考慮的首要問題,因此網站應該要向用戶提供一個安全的環(huán)境,使用驗證碼技術能有效的避免網站上常見的“身份欺騙”現象,使網站用戶能享有一個公平、安全的網絡環(huán)境。因此,網站設計者在設計網站時要充分考慮到安全問題,采用多種技術提高網站的安全性,同時,用戶也要提高自己的安全意識,消除安全隱患。
參考文獻:
[1]龔莎.網頁驗證碼技術綜述[J].信息與電腦,2014.
[2]歐志敏.關于驗證碼原理與應用的探討[J].華南金融電腦,2007.
[3]明日科技.PHP從入門到精通[M].北京:清華大學出版社,2012.
[4]宋尚平,李興保.PHP模板引擎Smarty的安裝配置及應用實現[J].現代教育技術,2007.