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