王春艷,李 帥
(中國(guó)電子科技集團(tuán)公司第三十八研究所,安徽合肥230088)
隨著現(xiàn)代科學(xué)技術(shù)的進(jìn)步,臨近空間獨(dú)特的資源優(yōu)勢(shì)已成為各國(guó)關(guān)注的熱點(diǎn),平流層飛艇運(yùn)行在臨近空間底部,依靠空氣靜浮力駐空,具有可定點(diǎn)和機(jī)動(dòng)巡航、駐空時(shí)間長(zhǎng)、載重量大、可重復(fù)使用等特點(diǎn),在區(qū)域防災(zāi)減災(zāi)、環(huán)境監(jiān)測(cè)、城市安全監(jiān)控、高分辨率實(shí)時(shí)區(qū)域監(jiān)視、預(yù)警和導(dǎo)彈防御、區(qū)域通信等方面具有重要的用途,作為一種新型信息平臺(tái),引起了世界上發(fā)達(dá)國(guó)家的廣泛關(guān)注。
利用計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)實(shí)現(xiàn)對(duì)飛艇運(yùn)行遠(yuǎn)程監(jiān)視和測(cè)控,確保飛艇的安全運(yùn)行是目前研究的重要方向。在飛艇飛行任務(wù)中,飛艇姿態(tài)的數(shù)據(jù)監(jiān)測(cè)和測(cè)控實(shí)時(shí)處理顯得尤為重要,能夠協(xié)助工程技術(shù)人員準(zhǔn)確地掌握飛艇運(yùn)行態(tài)勢(shì),正確地分析運(yùn)行過(guò)程和有效地指揮控制飛艇運(yùn)行。數(shù)據(jù)庫(kù)負(fù)責(zé)整個(gè)監(jiān)控系統(tǒng)的數(shù)據(jù)存儲(chǔ)工作[1],是整個(gè)測(cè)控系統(tǒng)的重要組成部分。通常情況下,商業(yè)數(shù)據(jù)庫(kù)需要專業(yè)的數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行管理且系統(tǒng)龐大,非常占用系統(tǒng)資源,使得設(shè)計(jì)系統(tǒng)復(fù)雜,影響了系統(tǒng)的運(yùn)行效率,考慮飛艇遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計(jì)需求和整個(gè)系統(tǒng)的性能,本文提出了在飛艇監(jiān)控中使用輕量級(jí)數(shù)據(jù)庫(kù)系統(tǒng)SQLite的方案。
飛艇測(cè)控系統(tǒng)應(yīng)實(shí)現(xiàn)以下幾種功能:
(1)數(shù)據(jù)采集和存儲(chǔ)。數(shù)據(jù)采集主要是由艇上飛控系統(tǒng)完成,通過(guò)兩塊飛控計(jì)算機(jī)(主控和備控)板,將采集的各種參數(shù)信息定時(shí)通過(guò)無(wú)線網(wǎng)絡(luò)傳輸?shù)降孛鏈y(cè)控計(jì)算機(jī)上的嵌入式服務(wù)器中進(jìn)行分析和存儲(chǔ)。
(2)歷史數(shù)據(jù)查詢。根據(jù)用戶輸入的查詢信息,查找數(shù)據(jù)庫(kù)中的相關(guān)數(shù)據(jù),提供給管理人員分析,對(duì)當(dāng)前能源系統(tǒng)的使用狀態(tài)和壽命進(jìn)行評(píng)估,對(duì)各執(zhí)行機(jī)構(gòu)的能效進(jìn)行風(fēng)險(xiǎn)評(píng)估,預(yù)測(cè)出當(dāng)前存在的潛在危險(xiǎn),在飛艇失效時(shí)進(jìn)行故障診斷、歸零分析,輔助尋找故障根源。
(3)遠(yuǎn)程控制功能。在系統(tǒng)遙控模式下,用戶遠(yuǎn)程對(duì)設(shè)備進(jìn)行控制,通過(guò)無(wú)線傳輸向艇上飛控系統(tǒng)發(fā)生控制指令,并將控制信息和回饋信息進(jìn)行存儲(chǔ)。
(4)設(shè)備自控參數(shù)設(shè)置。完成在自控模式下對(duì)設(shè)備的臨界值進(jìn)行設(shè)定,如果監(jiān)測(cè)數(shù)據(jù)超出了臨界范圍,發(fā)送報(bào)警信號(hào)或作出相應(yīng)的控制。
(5)整機(jī)狀態(tài)監(jiān)測(cè)。實(shí)現(xiàn)遠(yuǎn)程監(jiān)視整機(jī)運(yùn)行狀態(tài),包括飛艇各姿態(tài)數(shù)據(jù)顯示、各氣囊壓力指示,能源余量預(yù)估顯示以及全部設(shè)備運(yùn)行狀態(tài)與告警。
(6)用戶信息管理。用戶信息管理是系統(tǒng)中所需實(shí)現(xiàn)的一項(xiàng)最基本的功能,為系統(tǒng)提供了安全保障,可以有效防止非法用戶進(jìn)入系統(tǒng)查看數(shù)據(jù)。
遠(yuǎn)程測(cè)控系統(tǒng)的總體目標(biāo)是實(shí)現(xiàn)系統(tǒng)數(shù)據(jù)的結(jié)構(gòu)化管理[2],最大化共享網(wǎng)絡(luò)資源,最終達(dá)到異地實(shí)時(shí)遠(yuǎn)程測(cè)控的目的,通過(guò)簡(jiǎn)單的控制和操作完成遠(yuǎn)程測(cè)控功能,運(yùn)行時(shí)的各種狀態(tài)參數(shù)數(shù)據(jù)和控制參數(shù)實(shí)時(shí)存儲(chǔ)、分析,輔助工程技術(shù)人員提前決策。
SQLite是一個(gè)輕量級(jí)的關(guān)系數(shù)據(jù)庫(kù),具有三級(jí)模式的結(jié)構(gòu)體系,即用戶模式、邏輯模式和存儲(chǔ)模式。相對(duì)于傳統(tǒng)數(shù)據(jù)庫(kù),SQLite具有更好的實(shí)時(shí)性、系統(tǒng)開(kāi)銷小、底層控制能力強(qiáng)。SQLite能夠高效地利用有限資源,提高數(shù)據(jù)的存取速度,增強(qiáng)系統(tǒng)的安全性,并具有如下關(guān)鍵特點(diǎn):
(1)零配置。SQLite在使用前不需要安裝設(shè)置,不需要進(jìn)程來(lái)啟動(dòng)、停止或配置,不需要管理員去創(chuàng)建新數(shù)據(jù)庫(kù)或分配用戶權(quán)限,在系統(tǒng)崩潰或失電之后自動(dòng)恢復(fù)。
(2)支持絕大多數(shù)SQL-92標(biāo)準(zhǔn)的SQL命令,支持視圖、觸發(fā)器,支持嵌套SQL,具有事務(wù)處理功能,自動(dòng)維護(hù)事務(wù)的完整性、原子性等特性,支持實(shí)體完整性和參照完整性。
(3)零配置的數(shù)據(jù)庫(kù)引擎和安裝。使用SQLite時(shí),訪問(wèn)數(shù)據(jù)庫(kù)的程序直接從磁盤上的數(shù)據(jù)庫(kù)文件讀寫,沒(méi)有中間的服務(wù)器進(jìn)程。
(4)支持多種開(kāi)發(fā)語(yǔ)言和數(shù)據(jù)庫(kù)平臺(tái)無(wú)關(guān)性,支持大多數(shù)計(jì)算機(jī)語(yǔ)言,支持 Windows/Linux/Unix/Mac OS等主流的操縱系統(tǒng),可實(shí)現(xiàn)數(shù)據(jù)庫(kù)文件在機(jī)器之間自由共享。
(5)精簡(jiǎn)性與簡(jiǎn)單訪問(wèn)。優(yōu)化后整個(gè)SQLite庫(kù)小于225 KB。一個(gè)SQLite數(shù)據(jù)庫(kù)是一個(gè)單獨(dú)的普通磁盤文件,能夠被定位在路徑層次的任何地方。
(6)數(shù)據(jù)存儲(chǔ)量大。數(shù)據(jù)存儲(chǔ)在單個(gè)物理文件中,支持2 TB的數(shù)據(jù)存儲(chǔ)。
(7)源碼完全開(kāi)放。使用者可用于任何非商業(yè)和商業(yè)用途。
SQLite采用模塊化的設(shè)計(jì),主要由4個(gè)部分組成:內(nèi)核(Core)、SQL編譯器(SQL Compiler)、后端(Backend)以及附件(Accessories),內(nèi)部結(jié)構(gòu)如圖1所示[3]。

圖1 SQLite體系結(jié)構(gòu)圖
SQLite接口是一些已經(jīng)編寫好的C庫(kù),SQL語(yǔ)句通過(guò)接口進(jìn)入到高效的SQL編譯器,由標(biāo)記處理器分解成分析器可以識(shí)別的各個(gè)標(biāo)志符,然后由分析器重新組合標(biāo)志符并調(diào)用代碼生成器生成虛擬機(jī)器碼,交由虛擬機(jī)去執(zhí)行,最終完成SQL語(yǔ)句指定的任務(wù)。虛擬機(jī)是SQLite內(nèi)部結(jié)構(gòu)的核心,不僅完成與數(shù)據(jù)操作相關(guān)的全部操作,而且還是客戶和存儲(chǔ)之間信息進(jìn)行交換的中間單元。數(shù)據(jù)庫(kù)按照B樹(shù)(Btree)的形式存儲(chǔ)在磁盤上,通過(guò)可調(diào)整的頁(yè)面緩沖獲得對(duì)數(shù)據(jù)的快速查找和存儲(chǔ)。為了方便移植,SQLite使用一個(gè)抽象層接口(OS interface)與不同操作系統(tǒng)進(jìn)行對(duì)接。
SQLite數(shù)據(jù)庫(kù)直接部署在測(cè)控系統(tǒng)節(jié)點(diǎn)上,如圖2所示。艇上部署兩個(gè)飛控計(jì)算機(jī),相互作為備份控制,將艇上采集的各類傳感器數(shù)據(jù)定時(shí)傳輸給地面測(cè)控系統(tǒng),遙控模式下接收地面測(cè)控計(jì)算機(jī)發(fā)來(lái)的人工干預(yù)指令,控制各分系統(tǒng)設(shè)備,并將參數(shù)回送給地面測(cè)控計(jì)算機(jī);自控模式下根據(jù)測(cè)控系統(tǒng)設(shè)置的臨界值進(jìn)行自動(dòng)控制各設(shè)備。測(cè)控系統(tǒng)中所有接收的檢測(cè)數(shù)據(jù)和發(fā)送的控制操作均作為關(guān)鍵數(shù)據(jù),保存到數(shù)據(jù)庫(kù)服務(wù)器中。操作人員可以使用不同的終端登錄,查詢和分析整機(jī)監(jiān)測(cè)數(shù)據(jù)[4]。

圖2 測(cè)控系統(tǒng)數(shù)據(jù)庫(kù)部署
直接使用SQLite執(zhí)行一條SQL的插入語(yǔ)句時(shí)延范圍在100 ms以上,實(shí)驗(yàn)表明在頻繁記錄采集數(shù)據(jù)時(shí),這樣的數(shù)據(jù)錄入效率將嚴(yán)重影響記錄節(jié)點(diǎn)的運(yùn)行[5],錄入過(guò)程耗時(shí)過(guò)長(zhǎng),對(duì)于長(zhǎng)時(shí)間的數(shù)據(jù)采集任務(wù),有內(nèi)存消耗過(guò)多或內(nèi)存不足的潛在問(wèn)題[5]。
本文重點(diǎn)從以下三個(gè)方面進(jìn)行優(yōu)化處理:
(1)對(duì)大批量數(shù)據(jù)入庫(kù)操作進(jìn)行綜合優(yōu)化,縮短數(shù)據(jù)錄入時(shí)間;
(2)優(yōu)化數(shù)據(jù)庫(kù)單次插入數(shù)據(jù)的延時(shí);
(3)采用多線程并發(fā)處理技術(shù),數(shù)據(jù)采集處理和數(shù)據(jù)存儲(chǔ)同時(shí)進(jìn)行。
SQLite的內(nèi)存數(shù)據(jù)庫(kù)模式就是直接將數(shù)據(jù)庫(kù)創(chuàng)建在內(nèi)存中,相對(duì)于磁盤,內(nèi)存的數(shù)據(jù)讀寫速度要高出幾個(gè)數(shù)量級(jí),將數(shù)據(jù)保存在內(nèi)存中相比從磁盤上訪問(wèn)能夠極大地提高應(yīng)用的性能。
采用內(nèi)存數(shù)據(jù)庫(kù),在不進(jìn)行任何優(yōu)化時(shí)的單次數(shù)據(jù)錄入時(shí)間與優(yōu)化后的磁盤數(shù)據(jù)庫(kù)基本相當(dāng)。因此在存儲(chǔ)采集數(shù)據(jù)時(shí)采用內(nèi)存數(shù)據(jù)庫(kù)的模式實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)錄入。
在數(shù)據(jù)庫(kù)管理系統(tǒng)中,事務(wù)(Transaction)被定義為對(duì)特定數(shù)據(jù)庫(kù)的一組SQL操作,這組對(duì)數(shù)據(jù)庫(kù)的操作要么全部執(zhí)行,要么都不執(zhí)行。在SQLite中每一條插入/更新(INSERT/UPDATE)語(yǔ)句都默認(rèn)的被當(dāng)作一個(gè)事務(wù)執(zhí)行,每一次執(zhí)行就涉及一次打開(kāi)數(shù)據(jù)庫(kù)、寫數(shù)據(jù)庫(kù)、關(guān)閉數(shù)據(jù)庫(kù)的操作,大大延長(zhǎng)了數(shù)據(jù)庫(kù)操作的時(shí)間,因此,可以將批量的插入/更新操作顯式的定義為一組事務(wù),在批量錄入之前指定事務(wù)開(kāi)始處理,執(zhí)行語(yǔ)句為:sqlite3_exec(pSQLiteDB,"BEGIN",0,0,&zErr Msg);在所有數(shù)據(jù)錄入完畢之后指定事物提交處理,執(zhí)行語(yǔ)句為:sqlite3_exec(pSQLiteDB,"BEGIN",0,0,&zErr Msg),其中pSQLiteDB表示數(shù)據(jù)庫(kù)連接對(duì)象,"BEGIN"表示開(kāi)始事物處理,"COMMIT"表示提交事物處理。
SQLite支持事物的一個(gè)重要特性就是“原子提交”,意味著一個(gè)事物中的所有操作動(dòng)作要么全部發(fā)生,要么都不發(fā)生。SQLite的同步(synchronous)選項(xiàng)相當(dāng)于一種同步IO機(jī)制,所有對(duì)數(shù)據(jù)庫(kù)的修改都必須等待本次操作寫入到磁盤上后才返回。當(dāng)頻繁地對(duì)數(shù)據(jù)庫(kù)進(jìn)行INSERT/UPDATE操作時(shí),可以選擇關(guān)閉同步選項(xiàng),執(zhí)行語(yǔ)句為:SQLite3_exec(pSQLiteDB,"PRAGMASYNCHRONOUS=OFF",NULL,NULL,&zErr Msg),待所有事物提交后一次性更新磁盤數(shù)據(jù)庫(kù)。
經(jīng)過(guò)測(cè)試證明,關(guān)閉同步選項(xiàng)后,數(shù)據(jù)錄入操作時(shí)間可再縮短100 ms左右。
SQLite中日志是在系統(tǒng)遇到關(guān)機(jī)或斷電時(shí)用來(lái)恢復(fù)數(shù)據(jù)庫(kù),保持?jǐn)?shù)據(jù)庫(kù)完整性的措施,默認(rèn)情況下日志是隨著對(duì)數(shù)據(jù)庫(kù)的操作一起寫入磁盤的,SQLite中日志記錄模式修改為內(nèi)存記錄模式“MEMORY”,即不產(chǎn)生任何單獨(dú)的數(shù)據(jù)庫(kù)日志文件,所有的操作日志存儲(chǔ)于內(nèi)存中,更改SQLite默認(rèn)日志模式為內(nèi)存記錄模式,執(zhí)行語(yǔ)句為:“SQLite3_exec(pSQLiteDB,"PRAGMA JOURNAL_MODE=MEMORY",NULL,NULL,&zErr Msg)”,可以提高單次INSERT操作的效率。
嵌入式數(shù)據(jù)庫(kù)SQLite在飛艇運(yùn)行監(jiān)控系統(tǒng)中的應(yīng)用克服了使用傳統(tǒng)商業(yè)數(shù)據(jù)庫(kù)時(shí)系統(tǒng)開(kāi)發(fā)難度大,使用維護(hù)不方便[6]。由于SQLite數(shù)據(jù)庫(kù)使用簡(jiǎn)單,不需要專門的數(shù)據(jù)庫(kù)管理引擎,存取速度快,性能穩(wěn)定,完全滿足了飛艇監(jiān)控系統(tǒng)管理監(jiān)控?cái)?shù)據(jù)的需求。本文通過(guò)三點(diǎn)優(yōu)化策略切實(shí)地提高SQLite數(shù)據(jù)庫(kù)訪問(wèn)速度的方案,使SQLite數(shù)據(jù)庫(kù)的性能滿足飛艇飛行遠(yuǎn)程監(jiān)控中實(shí)時(shí)數(shù)據(jù)錄入需求。同時(shí)也證明了SQLite在功能和性能上可以很好地取代目前使用傳統(tǒng)商業(yè)數(shù)據(jù)庫(kù),降低了商業(yè)投入成本和維護(hù)成本。
[1]蔡勇,王勇.嵌入式數(shù)據(jù)庫(kù)SQLite在測(cè)控系統(tǒng)設(shè)計(jì)中的應(yīng)用[J].電子測(cè)試,2011(10):89-93.
[2]陳曉東,曹奇英.嵌入式數(shù)據(jù)庫(kù)SQLite的遠(yuǎn)程可視化維護(hù)管理工具的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2011,28(8):106-107.
[3](美)ALLEN G,OWENS M.SQLite權(quán)威指南(第2版)[M].北京:電子工業(yè)出版社,2012:21-137.
[4]李海貴,孫俊平.通用雷達(dá)數(shù)據(jù)處理系統(tǒng)仿真測(cè)試平臺(tái)設(shè)計(jì)[J].雷達(dá)科學(xué)與技術(shù),2010,8(4):339-342.
[5]周帆.SQLite在半實(shí)物仿真系統(tǒng)中的應(yīng)用與優(yōu)化[J].彈箭與制導(dǎo)學(xué)報(bào),2013,33(1):167-170.
[6]黃德才.數(shù)據(jù)庫(kù)原理及其應(yīng)用(第3版)[M].北京:科學(xué)出版社,2010:19-154.