引言
隨著嵌入式系統CPU硬件從8位到32位的發展,嵌入式系統軟件的開發環境也得到迅猛的發展,編程語言從10多年以前的匯編為主流發展到現在C、C++、Java為主流。另外,面向對象設計技術、組件技術等在嵌入式系統軟件設計中的應用也日益引起人們的重視。
在嵌入式系統軟件開發領域,Java是一門較新的異軍突起的編程語言。其優點是語言本身簡潔優美,完全按照面向對象思想設計,并且語言引入許多較為先進的特性,如多線程、自動內存管理和垃圾回收,非常適合于大規模復雜軟件系統的開發。其不足點是與硬件結合不夠緊密,同時代碼運行速度較慢。此外,對于內存的使用,程序難于管理和控制。
由于采用Java編程具有如上所述的眾多優點,越來越多的嵌入式系統采用Java技術來構造軟件系統。本文在介紹基于日本某自動售貨機產品的控制板的Java運行平臺基礎上,詳細討論筆者為其平臺開發的DB引擎的組成和設計思路。
1 Java運行環境平臺
圖1所示為Java運行環境的總體框架示意圖。本系統為克服Java的解釋執行機制所引起的執行速度慢的問題,在硬件上采用了Sun公司開發的Pico Java芯片。它能夠直接執行Java的二進制代碼,使Java的執行速度提高一個數量級以上。在硬件層的上面是OS層,本系統采用的是ITRON(日本東京大學坂村鍵教授設計的一種嵌入式操作系統,雖然在日本以外的市場影響不大,但在日本本地市場,占有率達90%以上)。由于ITRON規格制定得比較早,并且為兼顧低端嵌入式應用的場合,ITRON總體上功能比較簡單,并未把諸如TCP/IP、文件系統等內容包含在其里面,因此與嵌入式Linux等不一樣的是,TCP/IP、文件系統是以獨立的組件形式存在的。在OS層的上面是JVM層。與其它一般Java虛擬機不同的是,本系統的Java執行代碼不需要由JVM解釋執行,而是由CPU硬件直接執行。在JVM的上層是自動售貨機的基礎平臺類庫和公共組件層。本文介紹的DB引擎組件正是處于這一層。該層的上面是應用程序層,用于實現自動售貨機的各種控制、管理機能。
2 嵌入式系統DB引擎
2.1 DB引擎組件的引入
眾所周知,在臺式機領域,DB是一個十分關鍵的基礎軟件。以往嵌入式系統的軟件可能更側重于與硬件的交互與控制,但隨著對嵌入式系統功能需求的日益復雜化,嵌入式系統軟件中,信息、數據的保存與管理的比重也日益增加。在這樣的背景下,嵌入式系統軟件開發中,通過引入DB組件,對實現軟件整體框架結構的組件化與簡單化,有著十分明顯而重要的意義。
2.2 DB引擎組件的總體框架
如圖2所示,將整個DB組件設計為3層結構,分別為JDBC接口層、SQL解釋層和動作執行層。這3層之間呈單向依賴關系。也就是說,SQL解釋層依賴于動作執行層,但動作執行層不依賴于其上面的兩層,可以單獨存在而直接被使用。如果用戶以使用方便為主要目的,可采用完全配置方式,應用程序通過JDBC接口層存取數據。反之,如果用戶對空間和效率要求較高,可僅配置動作執行層組件,應用程序直接調用動作執行層的API進行數據的檢過和更新等操作。
(1)JDBC接口層
如前文所述是可選組件,旨在為應用程序提供一個標準的DB調用接口。
(2)SQL解釋層
本DB組件實現的SQL解釋層,只實現了標準SQL的一個小子集,主要完成select、delete、insert、update、create table、drop table等功能。其中數據操作語句(select、delete、insert、update)的解釋要點之一是where條件子句的解釋執行,類似于數學表達式求值算法。本文采用簡單直觀的“算符優先法”。該算法使用兩個工作棧,一個稱作OPTR棧,用以寄存運算符;另一個稱作OPND棧,用以寄存操作數或運算結果。算法的基本思想是:
①首先置操作數棧為空,表達式起始符“#”為運算棧的棧底元素;
②依此讀入表達式中每個Token。若是操作數,則進OPND棧adk是運算符,則和OPTR棧的棧頂運算符比較優先權后作相應操作,直至整個表達式求值完畢(即OPTR棧的棧頂元素和當前讀入的Token均為“#”。
本文實現的SQL子集描述如下:
預定義
<日期>
<統計函數名>:=MIN│MAX│COUNT│SUM
<統計函數>:=<統計函數>(
<統計list>:=<統計函數>,[,<統計函數>[,<統計函數>[…]]]
<數據類型>:=INT│UNMBER│CHAR│DATE
SQL文定義式
①SELECT*| ②SELECT<統計list>FROM ③UPDATE ④INSERT INTO ⑤DELETE FROM ⑥CREATE TABLE ⑦DROP TABLE 注:|表示多選個,<>表示某定義項目,[]表示可選項目,…代表循環省略表示。 (3)動作執行層 動作執行層是整個DB組件的核心和關鍵,因為所有的DB操作最終都由該層完成,同時用戶也可以跳過上面的兩層,直接調用該層的API,以實現相同的數據操作功能。下面介紹其主要設計要點和思路。 2.3 數據的表達與存儲 由于嵌入式系統的資源十分有限,不能引入復雜的算法和數據存儲格式,同時由于Java對二進制數據的處理十分不便,本文最終采用CSV格式來保存表數據。其要點是: ①各字段數據之間采用「,」分開; ②如果字段數據本身包含有「,」,則將整個字段數據用引號「」括起來; ③如果字段數據本身包含有引號「”」,則將引號「”」改寫為兩個重疊的引號「””」,依次類推。其次,每個記錄占文本文件的個行,每一個數據表與一個物理數據文件一一對應。 采用這種方式處理的優點是: ①全部數據都是采用字符串保存,Java處理起來十分方便; ②對不定長字段的保存處理與定長字段處理統一,不需要額外的附加處理,而且存儲效率高; ③對多字節文字的處理程序不需要額外的編碼轉換處理,由JVM平臺本身的功能可以自動完成。 當然,采用這種處理方式也存在其不足之處: ①由于在數據文件中,每條記錄的長度不定,數據即使局部更新,也必須重寫整個文件; ②由于同樣原因,單條記錄的檢索難于直接定位,而必須讀入整個數據文件。 為彌補由此產生的性能下降,本文采用數據Cache加以克服。也就是說,盡可能將數據緩存在內存中,通過減少對物理文件的讀寫操作來提高數據的性能。 2.4 多線程數據存取的同步與互斥 在Java虛擬機環境下,沒有多進程的概念,但對于多任務的處理提供了多線程的手段。本DB引擎組件是公共組件,供上層多個應用程序組件共同使用。由于上層的每個應用程序組件本身由一個或數個線程來執行,因此,DB引擎組件必須考慮多個線程同時存取某個數據時可能引起的沖突問題。對于該問題的解決辦法,一般是采用DB鎖定的方法。關于DB鎖定,進一步細分的話,可區分為讀鎖和寫鎖;根據鎖定粒度的粗細可分為按表鎖、按Page鎖、按記錄鎖等,不一而足。 為設計和實現的簡單起見,本DB引擎組件提供按表鎖定的方式,同時不區分讀寫鎖之間的區別。這樣,大大簡化了SQL語句的分析和處理過程,并且可以直接把鎖定操作與表的open操作相關聯,鎖解除與表的close操作相關聯。實現時,對應表對象Table的每一個實例,設置一個field變量,用于保存鎖定狀態,再利用Java語言提供的synchronized手段同,可以較為方便地實現數據表的鎖定功能。代表示例如下: //表鎖定。為了避免死鎖,有超時判斷邏輯 synchronized void lock()throws DBError{ long t2,t1; t1=System.currentTimeMillis(); //由于可能出現在wait語句被喚醒而卻得不到表鎖的情況,為提高超時邏輯判斷精度,采用循環 while(isLocked){ try{ wait(DBError.TIMEOUT/10); }catch(Exception e){e.printStackTrace();} //超時判斷 t2=System.currentTimeMillis(); if(t2-t1>DBError.TIMEOUT)break; } //發生超時退出循環情況,拋出例外 if(isLocked){ throw new DBError(DBError.TIMEOUT_ERR,name); } //設定鎖定標志 isLocked=true; } //表打開操作 //參數ro只讀打開標志 void open(Boolean ro)throws DBError{ lock(); readOnly=ro; //表數據讀入 load(); } //表關閉操作(同時釋放鎖) public synchronized void close() throws DBError{ if(isLocked==false)return; //關閉前,保存數據 if(isDirty)save(); if(isUnload)unload(); //釋放鎖,通知其它等待線程 isLocked=false; notify(); } 圖3所示為DB引擎組件的主要類之間的關系。其中,Database為數據庫類,用于描述和管理整個數據庫對象Table為數據表類,用于描述和管理表對象;TableData用于描述和管理保存表數據的物理介質(文件);Field為字段類,用于描述和管理字段類型信息;Record為記錄類,描述一條數據記錄。為簡化處理,本組件將Database類設計為singleton模式,即本組件只能創建一個Database實例。這對于嵌入式系統來說,大部分場合已經足夠。與數據庫的一般物理概念相對應,1個Database實例包含n個Table實例,1個Table實例包含n個Field實例。同時,1個Table實例包含1個TableData實例,1個TableData實例包含n個Record實例。 Connection類用于管理用戶訪問數據庫的會話(Session)過程。對應一個用戶的一次會話過程,生成一個Connection實例。Connection類對象保存著當前Session打開的Table列表,當用戶提交執行某SQL語句而需要鎖定某個Table時,系統首先檢查該表是否已經在當前Session已打開的Table列表中。如果已經被打開,則不需要進行重復的鎖定操作,直接反回對應的Table對象實例。反之,如果尚未包含在打開的Table列表中,表明當前Session尚未打開和鎖定該表,必須執行該表的打開和鎖定操作(如果該表已被其它Session打開,則必須等待到其它Session翻放該表為止)。 本DB組件還支持commit與rollback事務處理。能夠在如此微小的DB組件實現事務處理,主要得益于上述的Session管理框架。在Table類commit與rollback處理基礎上,當一個Session執行commit或rollback操作時,對包含在打開列表中的每個Table實例,調用執行相應的commit或rollback處理即可。 3 結語與展望 本DB組件已實際運行了大約兩年時間。這期間除了對該組件進行一些功能追加以外,主體框架上基本保持不變,從而在一定程序上表明了該設計框架的可行性和合理性。該組件編譯以后,class文件形成的jar包大小約為68KB,短小精度悍,便于使用。當然,該DB組件目前仍然存在一些不足:首先,較為關鍵的一點是速度問題。一直以來,Java的執行速度問題就是受批語的缺點所在,因此采用它實現自然也避免不了這人瓶頸。今后改進的思路之一是,將其中Java處理效率不高的部分移出Java,采用C實現;二者通過JNI手段加以連接,以提高總體的運行速度。第二點需要改進的地方是表鎖定的粒度問題。由于目前只能整個表進行鎖定,并且不區分讀鎖定與寫鎖定,因此粒度較粗。雖然這樣實現起來較為簡單,但在多任務處理環境中可能增加不必要的時間等待。最后,JDBC接口的實現目前還不完全,需要加以完善。[WHERE
[WHERE
SET
[(
[WHERE
(
圖3 DB引擎組件主要類的關系
2.5 DB組件實現的結構設計
嵌入式工業以太網的應用研究
6655
Java與'嵌入式' PostgreSQL數據庫單元測試的相關資料分享
Java在嵌入式應用開發扮演什么角色
嵌入式數據庫Sqlite在嵌入式工控平板電腦中的使用
嵌入式數據庫msql在Linux下有哪些應用?
嵌入式數據庫sqlite移植及使用的資料分享
嵌入式數據庫的作用是什么
嵌入式數據庫相關資料下載
嵌入式Web技術在無紙記錄儀中的應用研究
嵌入式系統中的數據存儲和管理的相關資料分享
嵌入式系統到底該選哪款數據庫,SQLite真的是最優解嗎?
嵌入式車載導航信息系統研究
嵌入式部署或模式的相關資料分享
Actian Zen(前稱Pervasive PSQL ) 嵌入式數據
H2數據庫介紹
Hsqldb數據庫的相關資料分享
Wince系統基于數據庫Sqlite的應用
labview與嵌入式數據庫sqlite數據庫的連接
一款基于Java實現的小巧而強大的關系型數據庫
使用Java平臺怎么實現可編程嵌入式系統?
哪種嵌入式數據庫支持pointer-based網絡模型?
在Spring框架中配置嵌入式數據庫引擎
基于Java平臺的可編程嵌入式系統設計
基于組件的嵌入式移動數據庫怎么實現?
跨平臺嵌入式數據庫EffiProz介紹
嵌入式空間數據庫綜合查詢算法
24一種微型嵌入式數據庫系統的設計與實現
17工控應用系統中嵌入式數據庫實時性研究
16一種嵌入式移動數據庫系統的研究與實現
11嵌入式移動數據庫研究
14基于ARM 的嵌入式數據庫研究與應用
17嵌入式移動數據庫NimbleDB的實現
17嵌入式數據庫在指紋識別系統中的應用
11嵌入式數據庫典型技術―SQLite和Berkeley DB的研究
17嵌入式數據庫的海量存儲技術研究
30嵌入式移動數據庫應用研究
24JAVA在SQLite嵌入式數據庫中的應用
19基于SOC技術的智能型嵌入式數據庫研究
16嵌入式數據庫的智能家居網關設計
35基于Linux的嵌入式實時數據庫的設計
10嵌入式移動數據庫的數據同步及其應用
15嵌入式數據庫系統Tern查詢機制研究
10嵌入式移動數據庫SQL Server for Windows
18嵌入式移動數據庫NimbleDB的實現
15嵌入式內存數據庫的研究與設計
17嵌入式數據庫加密管理系統的設計
18一種新的嵌入式移動數據庫系統的設計
12嵌入式Java運行平臺數據庫引擎的應用設計
25嵌入式數據庫的應用
1248
嵌入式移動數據庫與Agent技術原理及設計
673
嵌入式數據庫發展狀況研究
1164
SQLite嵌入式數據庫系統設計
3146
SQLite嵌入式數據庫在Wince中的應用實例
0一種新的嵌入式內存數據庫的設計
0嵌入式數據庫在Java中的應用解析
0數據庫引擎及底層實現原理
12099
一種新的嵌入式內存數據庫的設計方法
661
嵌入式移動數據庫與Agent技術原理設計
692
嵌入式數據庫mSQL在Linux下的應用
827
嵌入式數據庫在生產車間中的應用
1常用的數據庫引擎有哪些_數據庫引擎分類
22376
數據庫引擎是什么
12022
基于嵌入式數據庫的海量存儲技術解析
3176基于嵌入式數據庫的礦場安全系統設計方案詳解
1504
linux系統POS嵌入式數據庫如何去構建
1213
嵌入式數據庫
13H2:一款基于 Java 的嵌入式關系型數據庫
1Spring嵌入式數據庫示例
1【嵌入式實驗】《嵌入式數據庫 sqlite 移植及使用》
6嵌入式數據庫中的變更數據捕獲
1020SQLite數據庫的特點 SQLite數據庫簡單介紹
6465基于Rust的嵌入式符合ACID的鍵值數據庫
1559
電子發燒友App




評論