楊立苑 李 芬 周雪瑩 鄒海燕 劉喆玥 胡麗麗
(江西省氣象信息中心 南昌 330096)
近年來(lái),隨著互聯(lián)網(wǎng)技術(shù)的的快速發(fā)展,國(guó)家積極推進(jìn)“互聯(lián)網(wǎng)+”行動(dòng)[1],互聯(lián)網(wǎng)技術(shù)已經(jīng)成為包含氣象行業(yè)在內(nèi)各個(gè)行業(yè)提供服務(wù)的基石[2~4],其中Web 應(yīng)用是提供互聯(lián)網(wǎng)服務(wù)的重要手段。為了滿足氣象服務(wù)現(xiàn)代化的需要,各省氣象部門(mén)基于Web 應(yīng)用開(kāi)發(fā)框架建立了滿足各種氣象服務(wù)需求的Web應(yīng)用[5~7]。關(guān)系型數(shù)據(jù)庫(kù)是構(gòu)建Web應(yīng)用系統(tǒng)必不可少的一部分,氣象Web數(shù)據(jù)庫(kù)訪問(wèn)性能的高低嚴(yán)重影響著氣象Web應(yīng)用的服務(wù)質(zhì)量。
目前,Web 應(yīng)用系統(tǒng)主要通過(guò)對(duì)象關(guān)系映射(Object Relational Mapping,ORM)技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)[8],開(kāi)發(fā)人員使用的主流ORM 框架是基于靜態(tài)語(yǔ)言開(kāi)發(fā)的,例如Java 語(yǔ)言的Hibernate 框架[9]、C#語(yǔ)言的EF 框架[10]。在Web 應(yīng)用開(kāi)發(fā)中,ORM 技術(shù)能將面向?qū)ο蠼⒌膶?duì)象模型映射到關(guān)系型數(shù)據(jù)庫(kù)表結(jié)構(gòu),這樣開(kāi)發(fā)人員就不必再通過(guò)SQL語(yǔ)句去操作數(shù)據(jù)庫(kù),只需要操作對(duì)象實(shí)例便可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查。
造成這種挑戰(zhàn)的原因主要來(lái)自兩個(gè)方面。一是承載省級(jí)及以下氣象業(yè)務(wù)的服務(wù)器等基礎(chǔ)硬件設(shè)施陳舊,性能不高,二是數(shù)據(jù)表中站點(diǎn)數(shù)量多,隨著系統(tǒng)運(yùn)行時(shí)間的增長(zhǎng),數(shù)據(jù)表中數(shù)據(jù)記錄會(huì)爆炸性的增長(zhǎng),最終影響該表數(shù)據(jù)訪問(wèn)性能。例如,如果站點(diǎn)數(shù)是3000 個(gè),一年的小時(shí)數(shù)據(jù)記錄數(shù)可以達(dá)到2600 多萬(wàn)條。所以,本文主要研究的是如何在該特殊環(huán)境下去優(yōu)化氣象Web 數(shù)據(jù)庫(kù)中氣象類(lèi)數(shù)據(jù)表的ORM 訪問(wèn)性能,并且將其應(yīng)用到實(shí)際開(kāi)發(fā)應(yīng)用中。
Web 數(shù)據(jù)庫(kù)訪問(wèn)性能的優(yōu)化一般是從服務(wù)器硬件性能、數(shù)據(jù)庫(kù)軟件、數(shù)據(jù)庫(kù)設(shè)計(jì)、ORM 框架性能、緩存等方面進(jìn)行[11~14]。服務(wù)器硬件性能不滿足業(yè)務(wù)需求以及增設(shè)緩存服務(wù)需要大量資金進(jìn)行升級(jí),這方面尤其在市縣級(jí)很難一時(shí)得到解決。數(shù)據(jù)庫(kù)軟件和ORM 框架技術(shù)成熟,在本文特殊環(huán)境下優(yōu)化帶來(lái)的效果不佳。
本文優(yōu)化途徑是優(yōu)化數(shù)據(jù)庫(kù)表設(shè)計(jì),壓縮數(shù)據(jù)表中的記錄數(shù)。本文主要從兩個(gè)方面進(jìn)行數(shù)據(jù)表記錄數(shù)的壓縮,一是對(duì)數(shù)據(jù)表進(jìn)行分表操作,二是通過(guò)增加表屬性個(gè)數(shù)的方式減少同一時(shí)間段的數(shù)據(jù)記錄數(shù)。
但是經(jīng)過(guò)優(yōu)化設(shè)計(jì)的數(shù)據(jù)表并不能很好地得到靜態(tài)語(yǔ)言O(shè)RM 框架的支持。這是因?yàn)閮?yōu)化后的數(shù)據(jù)表需要根據(jù)時(shí)次動(dòng)態(tài)的操作表屬性,使用原生的SQL語(yǔ)句可以通過(guò)字符串拼接的方式簡(jiǎn)單實(shí)現(xiàn),但使用面向?qū)ο蟮姆绞叫枰軌騽?dòng)態(tài)地改變賦值屬性。例如一段邏輯代碼的語(yǔ)義是給實(shí)例A的t時(shí)屬性賦值,那么在t+x 時(shí)該段邏輯代碼需要給A 的t+x時(shí)屬性賦值。在靜態(tài)語(yǔ)言程序中對(duì)類(lèi)實(shí)例中公共屬性的操作可以通過(guò)變量賦值的方式進(jìn)行操作,對(duì)類(lèi)實(shí)例中私有屬性的操作需要通過(guò)調(diào)用類(lèi)中定義的公共方法進(jìn)行操作。簡(jiǎn)單的變量賦值方式和調(diào)用公共方法方式都無(wú)法改變程序中操作類(lèi)實(shí)例的屬性對(duì)象,這需要采用復(fù)雜的反射技術(shù)才能實(shí)現(xiàn)。
為了能夠更加快速簡(jiǎn)單地開(kāi)發(fā)氣象Web應(yīng)用,考慮到相比于國(guó)家級(jí),省級(jí)及以下氣象業(yè)務(wù)人員信息技術(shù)能力不強(qiáng)的現(xiàn)狀,本文基于動(dòng)態(tài)語(yǔ)言Python的Django ORM 框架實(shí)現(xiàn)了對(duì)優(yōu)化后數(shù)據(jù)表的訪問(wèn)方法,Python 語(yǔ)言可以非常容易的進(jìn)行動(dòng)態(tài)屬性賦值。最后將該方法應(yīng)用到實(shí)際Web應(yīng)用開(kāi)發(fā)中。
為了能夠動(dòng)態(tài)地增加分表的數(shù)量,減少分表產(chǎn)生的數(shù)據(jù)遷移量,本文使用一致性Hash 算法進(jìn)行分表操作。由于氣象類(lèi)數(shù)據(jù)中,時(shí)間屬性是用于數(shù)據(jù)檢索的重要指標(biāo),所以本文使用每條數(shù)據(jù)的時(shí)間戳作為Hash 函數(shù)的輸入。數(shù)據(jù)庫(kù)分表方法如圖1所示。一致性Hash 算法將Hash 函數(shù)的值空間構(gòu)成一個(gè)虛擬圓環(huán),值空間的取值范圍是[0,232-1]。本文將現(xiàn)有的表通過(guò)Hash 函數(shù)映射到虛擬圓環(huán)上。每條數(shù)據(jù)存儲(chǔ)的表取決于每條數(shù)據(jù)時(shí)間戳Hash值的大小。當(dāng)時(shí)間戳的Hash值大于某張表在Hash 環(huán)上的值,且該表的Hash 值離該條數(shù)據(jù)的Hash 值最近,那么該條數(shù)據(jù)存放在該表中。每次進(jìn)行數(shù)據(jù)的插入、更新、查詢也會(huì)根據(jù)時(shí)間戳判斷數(shù)據(jù)位于哪張表中。
圖1 數(shù)據(jù)庫(kù)分表方法
當(dāng)某張表中的數(shù)據(jù)記錄數(shù)超過(guò)了設(shè)定的閾值,那么該張表將會(huì)進(jìn)行分表。表中時(shí)間戳Hash 值大于新表Hash 值的數(shù)據(jù)將會(huì)遷移到新表中。其余表中的數(shù)據(jù)保持不變。為了不影響氣象數(shù)據(jù)服務(wù)的質(zhì)量,每次對(duì)所有表中記錄數(shù)的檢查以及分表的數(shù)據(jù)遷移操作都在凌晨一點(diǎn)執(zhí)行。由于氣象數(shù)據(jù)是時(shí)序,為了方便查詢,提高查詢效率,時(shí)間戳經(jīng)過(guò)Hash函數(shù)計(jì)算出的Hash值也會(huì)保持和輸入值一樣的大小順序,這樣時(shí)間相近的數(shù)據(jù)會(huì)盡量存放在一張表中。為了保證查詢數(shù)據(jù)的完整性,數(shù)據(jù)庫(kù)會(huì)有一張單獨(dú)的表來(lái)記錄每張分表存儲(chǔ)數(shù)據(jù)的最大和最小Hash值。
如果要在保障氣象Web 數(shù)據(jù)庫(kù)某張表數(shù)據(jù)信息量不變的前提下,減少該表數(shù)據(jù)的記錄總數(shù),那么可以將時(shí)次屬性和氣象數(shù)據(jù)屬性的笛卡爾積作為數(shù)據(jù)庫(kù)表的屬性。例如,區(qū)域站小時(shí)降水表可以將每個(gè)時(shí)次降水量都作為表中一個(gè)屬性,將同一個(gè)站點(diǎn)一天24條小時(shí)降水?dāng)?shù)據(jù)壓縮至一條數(shù)據(jù)。
FastEthernet0/1 128.2 128 19FWD 0 4096 cc00.1ca0.0001 128.2
圖2 數(shù)據(jù)庫(kù)表優(yōu)化設(shè)計(jì)方法
假設(shè)需要在數(shù)據(jù)庫(kù)中建表的對(duì)象屬性集合為S,對(duì)象的時(shí)間信息屬性和站點(diǎn)信息屬性集合為X,上一級(jí)時(shí)間單位包含當(dāng)前時(shí)間單位的集合為T(mén),設(shè)計(jì)的表中列屬性集合為C。數(shù)據(jù)庫(kù)表優(yōu)化設(shè)計(jì)方法如圖2 所示。集合X 中時(shí)間信息屬性主要是指該條數(shù)據(jù)的資料時(shí)間、資料更新時(shí)間等。如果當(dāng)前資料是小時(shí)數(shù)據(jù),那么資料時(shí)間單位是小時(shí),該資料的上一級(jí)時(shí)間單位是天,一天包含00 時(shí)t1、01 時(shí)t2在內(nèi)共24個(gè)時(shí)間屬性,這些時(shí)間屬性組成了集合T。集合X 中的時(shí)間屬性直接映射到集合C 中,時(shí)間單位上升一級(jí)。集合X 中的站點(diǎn)信息主要包括站點(diǎn)的站號(hào)、經(jīng)度、緯度等屬性,這些屬性可以直接映射到集合C 中。集合X 是集合S 的子集,集合S除去集合X 中的元素,剩下的元素是一系列氣象觀測(cè)要素屬性或者和氣象類(lèi)相關(guān)的要素屬性,例如到報(bào)情況。所有的要素屬性需要和集合T 中的所有屬性進(jìn)行笛卡爾積字符拼接,拼接的字符作為新的屬性映射到集合C 中。綜上所述,優(yōu)化后表的屬性集合C定義公式為C=X ∪((S-X)×T)。
在數(shù)據(jù)庫(kù)表設(shè)計(jì)完成之后,需要對(duì)設(shè)計(jì)的數(shù)據(jù)庫(kù)表進(jìn)行范式檢查。范式檢查主要包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)這三類(lèi)范式檢查[15]。按照本文數(shù)據(jù)庫(kù)表設(shè)計(jì)方法定義的數(shù)據(jù)庫(kù)表每一列屬性沒(méi)有重復(fù)也沒(méi)有存儲(chǔ)多個(gè)值,設(shè)計(jì)的主鍵由資料時(shí)間和站號(hào)組成,該主鍵能夠唯一區(qū)分每一條數(shù)據(jù)記錄。但是數(shù)據(jù)表中站點(diǎn)屬性,如經(jīng)度、緯度、海拔高度可能出現(xiàn)在其他數(shù)據(jù)表中。所以本文設(shè)計(jì)的表符合數(shù)據(jù)庫(kù)設(shè)計(jì)第一范式和第二范式,可能會(huì)不符合第三范式。第三范式的主要作用是保障不會(huì)出現(xiàn)大量的數(shù)據(jù)冗余,這里存儲(chǔ)少量冗余經(jīng)度、緯度數(shù)據(jù)所占用的多余空間是可以接受的。并且如果這些冗余信息存儲(chǔ)在同一張表中,在進(jìn)行該表數(shù)據(jù)訪問(wèn)時(shí),就不必為獲取這些信息再進(jìn)行連表操作,這樣有助于提升數(shù)據(jù)檢索性能。
Django 是使用Python 語(yǔ)言編寫(xiě)的開(kāi)源Web 應(yīng)用開(kāi)發(fā)框架[16],Django 框架關(guān)注點(diǎn)集中在模型(Model)、模版(Template)、視圖(Views)這三個(gè)部分。其中Model 部分指的是數(shù)據(jù)存取層,處理與數(shù)據(jù)存取相關(guān)的所有事務(wù)。Django 允許用戶通過(guò)管理命令Manage migrate 進(jìn)行數(shù)據(jù)庫(kù)的遷移,該命令可以一次性幫助開(kāi)發(fā)人員創(chuàng)建Models 中定義的數(shù)據(jù)表。
Web 應(yīng)用系統(tǒng)通過(guò)ORM 技術(shù)將軟件系統(tǒng)中的類(lèi)映射至對(duì)應(yīng)數(shù)據(jù)庫(kù)表,對(duì)數(shù)據(jù)庫(kù)表的操作主要是增(INSERT)、刪(DELETE)、改(UPDATE)、查(SELECT)這四種操作。首先是對(duì)數(shù)據(jù)庫(kù)分表的映射,本文采用開(kāi)源項(xiàng)目django-sharding 進(jìn)行分表映射,該項(xiàng)目允許用戶在執(zhí)行數(shù)據(jù)庫(kù)操作時(shí)動(dòng)態(tài)的選擇要操作的分表。其次是對(duì)數(shù)據(jù)表的面相對(duì)象操作。Python 能夠使ORM 進(jìn)行動(dòng)態(tài)操作的本質(zhì)在于可以通過(guò)字典“鍵-值對(duì)”中的鍵字符串進(jìn)行類(lèi)屬性值修改。為了能夠?qū)?duì)象實(shí)例進(jìn)行動(dòng)態(tài)屬性賦值,需要在對(duì)象的類(lèi)中定義一個(gè)動(dòng)態(tài)屬性賦值函數(shù),如下:
def init_from_dict(self,init_dic):
for k in init_dic:
self.__dict__[k]=init_dic[k]
其中init_dic 是字典數(shù)據(jù)結(jié)構(gòu),該字典每個(gè)元素的鍵是類(lèi)的屬性名,值是鍵對(duì)應(yīng)屬性的值。Python中定義的類(lèi)本質(zhì)也是一個(gè)字典,在這通過(guò)循環(huán)的方式對(duì)init_dic中包含的所有屬性進(jìn)行動(dòng)態(tài)的修改,這樣就不用去使用靜態(tài)語(yǔ)言中復(fù)雜的反射技術(shù)。
在定義好映射類(lèi)的基礎(chǔ)上,開(kāi)發(fā)Web應(yīng)用時(shí)便可以在業(yè)務(wù)邏輯中進(jìn)行相關(guān)數(shù)據(jù)庫(kù)操作了。數(shù)據(jù)庫(kù)的動(dòng)態(tài)增操作首先要需要定義一個(gè)空字典,將所有需要更改的屬性及該屬性的值賦給字典,然后用自定義的方法init_from_dict進(jìn)行類(lèi)實(shí)例的初始化,最后通過(guò)Django ORM 的函數(shù)進(jìn)行數(shù)據(jù)庫(kù)表數(shù)據(jù)的批量增操作。數(shù)據(jù)庫(kù)的動(dòng)態(tài)查操作需要調(diào)用Django ORM 提供的Q 函數(shù),使用Q 函數(shù)只需要定義條件邏輯連接器和查詢條件即可進(jìn)行數(shù)據(jù)庫(kù)查詢,條件邏輯連接器支持與(AND)、或(OR)、非(~)邏輯,查詢條件也只需通過(guò)字典鍵值對(duì)的方式添加。數(shù)據(jù)庫(kù)的動(dòng)態(tài)刪操作是基于查操作,進(jìn)行查操作獲取返回的查詢結(jié)果對(duì)象后,只需調(diào)用delete 函數(shù)即可將該對(duì)象從數(shù)據(jù)庫(kù)中刪除。數(shù)據(jù)庫(kù)的動(dòng)態(tài)改操作類(lèi)似于數(shù)據(jù)庫(kù)的動(dòng)態(tài)增操作,但首先需要先通過(guò)查操作獲取需要更改的記錄對(duì)象,然后通過(guò)該對(duì)象的init_from_dict 函數(shù)進(jìn)行相關(guān)屬性值的修改,最后通過(guò)save 函數(shù)即可完成該條數(shù)據(jù)的修改。Django ORM動(dòng)態(tài)訪問(wèn)數(shù)據(jù)庫(kù)操作示例如表1所示。
表1 Django ORM動(dòng)態(tài)訪問(wèn)數(shù)據(jù)庫(kù)操作示例
本文使用三臺(tái)虛擬機(jī)(VM)作為氣象Web數(shù)據(jù)庫(kù)訪問(wèn)性能優(yōu)化效果驗(yàn)證的實(shí)驗(yàn)環(huán)境。這三臺(tái)虛擬機(jī)部署在江西省氣象云平臺(tái)[17]當(dāng)中,具體的配置環(huán)境如表2所示。三臺(tái)虛擬機(jī)都使用CentOS 7.4作為操作系統(tǒng),其中一臺(tái)虛擬機(jī)部署數(shù)據(jù)庫(kù)MySQL 5.4,一臺(tái)虛擬機(jī)部署采用優(yōu)化技術(shù)的Django Web測(cè)試應(yīng)用,一臺(tái)虛擬機(jī)部署未采用優(yōu)化技術(shù)的Django Web 測(cè)試應(yīng)用。Django Web 測(cè)試應(yīng)用使用的Python 動(dòng)態(tài)語(yǔ)言運(yùn)行環(huán)境版本是Python 3.6。云平臺(tái)分配給部署MySQL 虛擬機(jī)的CPU 是4 核@2.1GHz,內(nèi)存大小是8GB;分配給部署Django Web測(cè)試應(yīng)用虛擬機(jī)的CPU 是2 核@2.1GHz,內(nèi)存大小是4GB。
表2 驗(yàn)證實(shí)驗(yàn)環(huán)境虛擬機(jī)配置
實(shí)驗(yàn)首先需要向MySQL 數(shù)據(jù)庫(kù)注入氣象數(shù)據(jù),實(shí)驗(yàn)使用的數(shù)據(jù)是江西省2017 年全年所有區(qū)域站小時(shí)降水?dāng)?shù)據(jù),江西省區(qū)域站個(gè)數(shù)是2456個(gè)。為優(yōu)化后Django Web 測(cè)試應(yīng)用建立的數(shù)據(jù)庫(kù)表是按照本文提出的設(shè)計(jì)方法設(shè)計(jì)的,以日期和站號(hào)作為主鍵,24 個(gè)時(shí)次和小時(shí)降水量的笛卡爾積作為元素屬性。為優(yōu)化前Django Web 測(cè)試應(yīng)用建立的數(shù)據(jù)庫(kù)表是按照傳統(tǒng)氣象數(shù)據(jù)庫(kù)設(shè)計(jì)方式建立,以時(shí)次和站號(hào)作為主鍵,小時(shí)降水量作為屬性。然后用Django 技術(shù)開(kāi)發(fā)兩個(gè)簡(jiǎn)易的Web 測(cè)試應(yīng)用,測(cè)試應(yīng)用開(kāi)發(fā)完畢后部署到相應(yīng)的虛擬機(jī)中。最后,使用Web 測(cè)試應(yīng)用進(jìn)行數(shù)據(jù)庫(kù)讀寫(xiě)測(cè)試。
進(jìn)行Web 測(cè)試應(yīng)用的數(shù)據(jù)庫(kù)讀寫(xiě)測(cè)試需要分6 次進(jìn)行。每次向數(shù)據(jù)庫(kù)中注入氣象數(shù)據(jù),使得數(shù)據(jù)表中的數(shù)據(jù)集時(shí)間跨度達(dá)到1周、1個(gè)月、3個(gè)月、6 個(gè)月、9 個(gè)月、12 個(gè)月。每次注入完數(shù)據(jù)后,分別測(cè)試Django Web 應(yīng)用的讀寫(xiě)操作。讀操作是連續(xù)進(jìn)行100 次查操作,隨機(jī)查詢某個(gè)站點(diǎn)某天某時(shí)次的降水量,統(tǒng)計(jì)完成100 次查操作的時(shí)間。寫(xiě)操作是連續(xù)進(jìn)行100次增操作,隨機(jī)插入2016年某個(gè)站點(diǎn)某天某時(shí)次的降水量,統(tǒng)計(jì)完成100 次增操作的時(shí)間。
驗(yàn)證實(shí)驗(yàn)讀寫(xiě)測(cè)試結(jié)果如圖3、圖4 所示。在數(shù)據(jù)集時(shí)間跨度比較小情況下,采用本文所提出優(yōu)化技術(shù)開(kāi)發(fā)的Django Web測(cè)試應(yīng)用ORM 訪問(wèn)性能和傳統(tǒng)設(shè)計(jì)方法開(kāi)發(fā)的Web測(cè)試應(yīng)用ORM 訪問(wèn)性能差不多,ORM 讀測(cè)試的百次訪問(wèn)耗時(shí)都集中在9s 左右,ORM 寫(xiě)測(cè)試的百次訪問(wèn)耗時(shí)都集中在12s左右。但是,隨著數(shù)據(jù)集時(shí)間跨度的增加未采用優(yōu)化技術(shù)的應(yīng)用ORM 訪問(wèn)性能快速衰減,12 個(gè)月數(shù)據(jù)集的ORM讀測(cè)試的百次訪問(wèn)耗時(shí)達(dá)18s,12個(gè)月數(shù)據(jù)集的ORM 寫(xiě)測(cè)試的百次訪問(wèn)耗時(shí)達(dá)25s,而采用優(yōu)化技術(shù)的應(yīng)用ORM 訪問(wèn)性能總體保持平穩(wěn)不變。
圖3 數(shù)據(jù)庫(kù)ORM讀測(cè)試結(jié)果
圖4 數(shù)據(jù)庫(kù)ORM寫(xiě)測(cè)試結(jié)果
本文將提出的氣象Web 數(shù)據(jù)庫(kù)數(shù)據(jù)小時(shí)表訪問(wèn)性能優(yōu)化方法應(yīng)用于江西省區(qū)域站數(shù)據(jù)直傳運(yùn)維保障系統(tǒng)。江西省區(qū)域站數(shù)據(jù)直傳運(yùn)維保障Web 系統(tǒng)采集入庫(kù)了每個(gè)時(shí)次全省區(qū)域站數(shù)據(jù)在每個(gè)傳輸環(huán)節(jié)的傳輸情況,包括CIMISS CTS[18]、省級(jí)區(qū)域站中心站、區(qū)域站報(bào)文來(lái)源、區(qū)域站電量供應(yīng)等環(huán)節(jié)。省、市、縣三級(jí)區(qū)域站數(shù)據(jù)傳輸業(yè)務(wù)運(yùn)維保障人員可以通過(guò)該系統(tǒng)查詢區(qū)域站每個(gè)時(shí)次每個(gè)傳輸環(huán)節(jié)是否正常。該系統(tǒng)也提供了對(duì)區(qū)域站數(shù)據(jù)傳輸情況的統(tǒng)計(jì)、分析、診斷。該系統(tǒng)分為數(shù)據(jù)存儲(chǔ)與訪問(wèn)層、業(yè)務(wù)邏輯層、數(shù)據(jù)展示層。
本文將氣象Web 數(shù)據(jù)庫(kù)訪問(wèn)優(yōu)化技術(shù)應(yīng)用于數(shù)據(jù)存儲(chǔ)與訪問(wèn)層,設(shè)計(jì)實(shí)現(xiàn)了省級(jí)區(qū)域站數(shù)據(jù)直傳情況數(shù)據(jù)庫(kù),基于Django ORM 進(jìn)行數(shù)據(jù)庫(kù)的動(dòng)態(tài)訪問(wèn),并且向業(yè)務(wù)邏輯層提供數(shù)據(jù)訪問(wèn)接口。最后運(yùn)維人員可以通過(guò)Web 展示層進(jìn)行區(qū)域站數(shù)據(jù)直傳情況的查詢和故障診斷,圖5 是區(qū)域站數(shù)據(jù)直傳歷史情況查詢頁(yè)面示例。該運(yùn)維保障系統(tǒng)的實(shí)現(xiàn)基本上滿足了省、市、縣三級(jí)運(yùn)維保障人員對(duì)區(qū)域站數(shù)據(jù)直傳保障的需求,經(jīng)過(guò)優(yōu)化之后,系統(tǒng)查詢效率得到了一定的提升,提高了平常業(yè)務(wù)工作的效率,推動(dòng)了該運(yùn)維保障系統(tǒng)在江西省省、市、縣三級(jí)氣象部門(mén)的應(yīng)用。
圖5 區(qū)域站數(shù)據(jù)直傳歷史情況查詢頁(yè)面
本文設(shè)計(jì)了一種面向氣象Web 應(yīng)用的數(shù)據(jù)庫(kù)ORM 訪問(wèn)性能優(yōu)化方法,并且針對(duì)優(yōu)化后的數(shù)據(jù)庫(kù)基于Python 語(yǔ)言提供了ORM 框架下的動(dòng)態(tài)訪問(wèn)操作方法。實(shí)驗(yàn)結(jié)果表明該優(yōu)化方法是有效的,本文也將該方法應(yīng)用到江西省區(qū)域數(shù)據(jù)直傳保障系統(tǒng)開(kāi)發(fā)中。但是該方法面臨著在數(shù)據(jù)庫(kù)表屬性過(guò)多的情況下會(huì)明顯增加軟件開(kāi)發(fā)人員工作量的問(wèn)題,下一步的主要工作是研究如何進(jìn)行數(shù)據(jù)庫(kù)表和對(duì)象模型類(lèi)代碼的自動(dòng)化生成,提高Web應(yīng)用開(kāi)發(fā)人員工作效率。