許 立
(中煤科工集團(tuán)重慶研究院 重慶 400013)
伴隨嵌入式系統(tǒng)被廣泛應(yīng)用,加上用戶越來(lái)越高的數(shù)據(jù)處理、數(shù)據(jù)管理等需求,各式各樣的智能設(shè)備、數(shù)據(jù)庫(kù)技術(shù)有著緊密的結(jié)合度,這種現(xiàn)狀越來(lái)越受到各行業(yè)的重視??v觀國(guó)內(nèi)外對(duì)嵌入式數(shù)據(jù)庫(kù)的應(yīng)用現(xiàn)狀,可知,當(dāng)下這種嵌入式數(shù)據(jù)庫(kù)開(kāi)始被廣泛應(yīng)用,其市場(chǎng)也加快發(fā)展步伐,進(jìn)入一個(gè)可喜的發(fā)展階段。
以Linux平臺(tái)為基礎(chǔ)的數(shù)據(jù)庫(kù)數(shù)量繁多,通常,運(yùn)用在大型商業(yè)方面的數(shù)據(jù)庫(kù)就包括: Sybase、Oracle等下面簡(jiǎn)單羅列幾種常見(jiàn)類(lèi)型:
(1)PostgreSQLPostgreSQL不僅是全球最優(yōu)秀的一類(lèi)開(kāi)放源碼數(shù)據(jù)庫(kù),且使用它無(wú)需繳納任何購(gòu)買(mǎi)費(fèi)與版權(quán)費(fèi),是對(duì)用戶完全免費(fèi)的。所以,很多Linux發(fā)行版本將之作為首選。比如,TurboLinux和Redhat都預(yù)裝了該數(shù)據(jù)庫(kù)。加上,該數(shù)據(jù)庫(kù)具有很強(qiáng)大的兼容性,若為SQL92兼容,將之做移植則非??旖?、簡(jiǎn)單。
(2)MySQLMySQL是一種多進(jìn)程、多用戶的SQLserver數(shù)據(jù)庫(kù)。它包含:一個(gè)mysqld、libraries的client或者server實(shí)現(xiàn)工具、client programs;較適宜于簡(jiǎn)單且小的數(shù)據(jù)庫(kù),不能很好支持復(fù)雜操作。其licensing policy表現(xiàn)為:若你是一般的終極用戶,使用該數(shù)據(jù)庫(kù)無(wú)需付錢(qián);如果作為或直接或間接對(duì)該服務(wù)程序、相關(guān)產(chǎn)品加以出售的用戶,抑或是在某客戶端對(duì)其加以維護(hù),這樣的情況下,是需要付費(fèi)使用的。若在發(fā)行版中含有MySQL,則需獲得相應(yīng)許可。
(3)mSQL(mini SQL)mSQL是面向單個(gè)用戶的數(shù)據(jù)庫(kù)的管理系統(tǒng)。其特點(diǎn)是短小精悍,因此,由它開(kāi)發(fā)出來(lái)的一些應(yīng)用系統(tǒng)頗受網(wǎng)絡(luò)用戶的青睞。該系統(tǒng)不是一款完全免費(fèi)的軟件。只有進(jìn)行學(xué)術(shù)研究、在大學(xué)里使用、做慈善等不以營(yíng)利為目的的一系列活動(dòng)時(shí),該軟件才對(duì)使用者免費(fèi)開(kāi)放。如果不滿足上屬免費(fèi)許可,就要進(jìn)行付費(fèi)才可以注冊(cè)獲得使用版權(quán)。
對(duì)數(shù)據(jù)庫(kù)的需求特點(diǎn)面對(duì)種類(lèi)繁多的數(shù)據(jù)庫(kù),怎么來(lái)選擇適合嵌入系統(tǒng)的哪一款呢?后者的開(kāi)發(fā)環(huán)境將直接決定它所需要的數(shù)據(jù)庫(kù)種類(lèi)。
(1)適當(dāng)?shù)捏w積嵌入系統(tǒng)對(duì)數(shù)據(jù)存儲(chǔ)、程序運(yùn)行通常有比較嚴(yán)格的空間限制。因此對(duì)適用該系統(tǒng)的數(shù)據(jù)庫(kù)要具有適當(dāng)體積。
(2)較強(qiáng)的功能嵌入式開(kāi)發(fā)應(yīng)用繁多,用戶的基本需求決定,開(kāi)發(fā)時(shí)要有個(gè)功能齊備、體積合適的數(shù)據(jù)庫(kù),這樣才能更好的失序數(shù)據(jù)管理。開(kāi)發(fā)人員所采用的技術(shù)應(yīng)可以提供一份完備文檔,且十分易于開(kāi)發(fā)。
(3)開(kāi)源的代碼作為產(chǎn)品開(kāi)發(fā),開(kāi)源代碼既可以降低產(chǎn)品生產(chǎn)的成本,還可以完善產(chǎn)品維護(hù),為產(chǎn)品穩(wěn)定運(yùn)行備以徹底解決手段。上述Sybase、Oracle等數(shù)據(jù)庫(kù)技術(shù),功能強(qiáng)大、體積龐大、付費(fèi)使用、用于大型商用。MySQL體積中等,卻可以提供同等功能,因此成為中小企業(yè)數(shù)據(jù)庫(kù)的應(yīng)用首選,在商業(yè)應(yīng)用中不是免費(fèi)的,對(duì)嵌入式開(kāi)發(fā),空間仍太大,目前尚不適合。mSQL是SQL的簡(jiǎn)化,開(kāi)發(fā)方便、短小精悍,適于嵌入式開(kāi)發(fā),但使用期限只有30天,并不是完全開(kāi)源。
D·理查德·希普開(kāi)發(fā)出SQLite,這種小型C庫(kù)可以實(shí)現(xiàn)強(qiáng)大的嵌入式數(shù)據(jù)庫(kù)的管理。它支持大多數(shù)的SQL92:多表、索引、視圖、事務(wù)、觸發(fā)、驅(qū)動(dòng)、用戶接口。該庫(kù)內(nèi)聚性很強(qiáng),通過(guò)ANSI C代碼老實(shí)現(xiàn),可應(yīng)用于包括商業(yè)在內(nèi)的任何應(yīng)用。此外,它具有有效、高速、可升級(jí)等優(yōu)點(diǎn),可運(yùn)行于ARM/ Linux、SPARC / Solaris等多種類(lèi)型的硬件平臺(tái)。
1SQLite體系結(jié)構(gòu)SQLite 有種標(biāo)準(zhǔn)化的優(yōu)雅設(shè)計(jì)。它主要分為八個(gè)子系統(tǒng)。其中,一些子系統(tǒng)與關(guān)系數(shù)據(jù)庫(kù)的管理十分接近。頂層為標(biāo)記處理器、分析器。SQLite的分析生成器是高度優(yōu)化的,這種生成器能快速產(chǎn)生高效率代碼。其新穎設(shè)計(jì)可以實(shí)現(xiàn)有效抵抗內(nèi)存泄漏的效果?;贙nuth,底部為優(yōu)化過(guò)的B樹(shù),可運(yùn)行于頁(yè)面緩沖之上,該頁(yè)面緩存是能調(diào)整的,利于最大化降低磁盤(pán)查找。再往下為頁(yè)面的高速緩存,作用于OS抽象層上方。
對(duì)SQLite 進(jìn)行API時(shí)非常好用的。三個(gè)執(zhí)行SQL、獲得數(shù)據(jù)函數(shù)就可實(shí)現(xiàn)。C語(yǔ)言的API是腳本接口之基礎(chǔ),比如,已經(jīng)發(fā)布過(guò)的Tcl接口。
應(yīng)用C語(yǔ)言三個(gè)步驟即可實(shí)現(xiàn)API。第一,提供訪問(wèn)模式、文件名來(lái)對(duì)“sqlite _open()”連接數(shù)據(jù)庫(kù)進(jìn)行調(diào)用。第二,執(zhí)行“callback”函數(shù),通過(guò)SQLite來(lái)對(duì)每條記錄進(jìn)行“callback”函數(shù)執(zhí)行,以此獲取來(lái)自數(shù)據(jù)庫(kù)里的結(jié)果。第三,調(diào)用“sqlite_exec()”可執(zhí)行某個(gè)SQL查詢,且獲得一個(gè)“callback”函數(shù)的指針。
SQLite可以提供“存取二進(jìn)制大對(duì)象”方法,在數(shù)據(jù)庫(kù)管理、線程安全、API擴(kuò)展等一些方面提供方便而強(qiáng)大的技術(shù)支持。
在ARM-Linux平臺(tái),4SQLite實(shí)現(xiàn)SQLite,嵌入數(shù)據(jù)庫(kù)以源碼進(jìn)行發(fā)布,可根據(jù)差異化平臺(tái)來(lái)交叉編譯源碼,完成在眾多硬件平臺(tái)上的移植。編譯的主要步驟如下:
(1)去“http://www.sqlite.org/”的cvs里去下載一個(gè)最新源代碼包,對(duì)其進(jìn)行解壓,生成一個(gè)sqlite目錄,然后,新建轉(zhuǎn)到同級(jí)目錄。
(2)“echo $PATH”命令下查看PATH里是不是已經(jīng)含有編譯工具——armlinuxgcc。
(3)在ARMLinux下確保sqlite可以正常運(yùn)行,需要修改“sqlite/src/sqliteInt.h”,來(lái)確保btree變量大小是正確的。
(4)選擇configure完成某些配置。對(duì)sqlite這一目錄下的configure進(jìn)行修改,使其不對(duì)交叉編譯的環(huán)境進(jìn)行檢查。
(5)對(duì)Makefile文件進(jìn)行修改。把代碼行“BCC=armlinuxgccgO2”改為“BCC=gccgO2”。此外,通常以靜態(tài)鏈接形式把sqlite置于ARMLinux硬件板進(jìn)行運(yùn)行,因此,繼續(xù)將Makefile進(jìn)行修改,找到“s以qlite:”為標(biāo)記的代碼段,把“l(fā)ibsqlite.la”改成“.libs/libsqlite.a”。完成上面的修改之后,使用make來(lái)生成s libsqlite.a 和libsqlite.so、qlite。
經(jīng)大量的分析、對(duì)比,結(jié)合嵌入式系統(tǒng)的開(kāi)發(fā)特點(diǎn),在大量數(shù)據(jù)庫(kù)版本中選擇出一款極為適合嵌入數(shù)據(jù)庫(kù)的應(yīng)用軟件——SQLite。然后通過(guò)ARMLinux對(duì)SQLite完成編譯,在此基礎(chǔ)上,在項(xiàng)目中進(jìn)一步進(jìn)行開(kāi)發(fā)試驗(yàn)。經(jīng)實(shí)踐證明,軟件SQLite可以非常出色的滿足系統(tǒng)的數(shù)據(jù)庫(kù)應(yīng)用要求。
[1]Michael Owens.Embedding an SQL Database with SQLite.Linux Journal, 20030601.
[2]How To Compile.http://www.sqlite.org/.
[3]薛啟康.Linux環(huán)境下的數(shù)據(jù)庫(kù).中國(guó)計(jì)算機(jī)報(bào),2001總期號(hào):1009.