<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Java運行平臺數據庫引擎的應用研究

嵌入式Java運行平臺數據庫引擎的應用研究

作者: 時(shí)間:2004-12-11 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:介紹某的總體框架;在此基礎上,詳細討論為該開(kāi)發(fā)的(DB)組件的框架和結構組成,描述該組件實(shí)現的SQL子集和數據表達方式以及邏輯算法的設計思路;提出該組件今后的改進(jìn)設想。

關(guān)鍵詞: 系統

引言

隨著(zhù)系統CPU硬件從8位到32位的發(fā)展,嵌入式系統軟件的開(kāi)發(fā)環(huán)境也得到迅猛的發(fā)展,編程語(yǔ)言從10多年以前的匯編為主流發(fā)展到現在C、C++、為主流。另外,面向對象設計技術(shù)、組件技術(shù)等在嵌入式系統軟件設計中的也日益引起人們的重視。

在嵌入式系統軟件開(kāi)發(fā)領(lǐng)域,Java是一門(mén)較新的異軍突起的編程語(yǔ)言。其優(yōu)點(diǎn)是語(yǔ)言本身簡(jiǎn)潔優(yōu)美,完全按照面向對象思想設計,并且語(yǔ)言引入許多較為先進(jìn)的特性,如多線(xiàn)程、自動(dòng)內存管理和垃圾回收,非常適合于大規模復雜軟件系統的開(kāi)發(fā)。其不足點(diǎn)是與硬件結合不夠緊密,同時(shí)代碼速度較慢。此外,對于內存的使用,程序難于管理和控制。

由于采用Java編程具有如上所述的眾多優(yōu)點(diǎn),越來(lái)越多的嵌入式系統采用Java技術(shù)來(lái)構造軟件系統。本文在介紹基于日本某自動(dòng)售貨機產(chǎn)品的控制板的Java基礎上,詳細討論筆者為其平臺開(kāi)發(fā)的DB的組成和設計思路。

1 Java運行環(huán)境平臺

圖1所示為Java運行環(huán)境的總體框架示意圖。本系統為克服Java的解釋執行機制所引起的執行速度慢的問(wèn)題,在硬件上采用了Sun公司開(kāi)發(fā)的Pico Java芯片。它能夠直接執行Java的二進(jìn)制代碼,使Java的執行速度提高一個(gè)數量級以上。在硬件層的上面是OS層,本系統采用的是ITRON(日本東京大學(xué)坂村鍵教授設計的一種嵌入式操作系統,雖然在日本以外的市場(chǎng)影響不大,但在日本本地市場(chǎng),占有率達90%以上)。由于ITRON規格制定得比較早,并且為兼顧低端嵌入式的場(chǎng)合,ITRON總體上功能比較簡(jiǎn)單,并未把諸如TCP/IP、文件系統等內容包含在其里面,因此與嵌入式Linux等不一樣的是,TCP/IP、文件系統是以獨立的組件形式存在的。在OS層的上面是JVM層。與其它一般Java虛擬機不同的是,本系統的Java執行代碼不需要由JVM解釋執行,而是由CPU硬件直接執行。在JVM的上層是自動(dòng)售貨機的基礎平臺類(lèi)庫和公共組件層。本文介紹的DB引擎組件正是處于這一層。該層的上面是程序層,用于實(shí)現自動(dòng)售貨機的各種控制、管理機能。

2 嵌入式系統DB引擎

2.1 DB引擎組件的引入

眾所周知,在臺式機領(lǐng)域,DB是一個(gè)十分關(guān)鍵的基礎軟件。以往嵌入式系統的軟件可能更側重于與硬件的交互與控制,但隨著(zhù)對嵌入式系統功能需求的日益復雜化,嵌入式系統軟件中,信息、數據的保存與管理的比重也日益增加。在這樣的背景下,嵌入式系統軟件開(kāi)發(fā)中,通過(guò)引入DB組件,對實(shí)現軟件整體框架結構的組件化與簡(jiǎn)單化,有著(zhù)十分明顯而重要的意義。

2.2 DB引擎組件的總體框架

如圖2所示,將整個(gè)DB組件設計為3層結構,分別為JDBC接口層、SQL解釋層和動(dòng)作執行層。這3層之間呈單向依賴(lài)關(guān)系。也就是說(shuō),SQL解釋層依賴(lài)于動(dòng)作執行層,但動(dòng)作執行層不依賴(lài)于其上面的兩層,可以單獨存在而直接被使用。如果用戶(hù)以使用方便為主要目的,可采用完全配置方式,應用程序通過(guò)JDBC接口層存取數據。反之,如果用戶(hù)對空間和效率要求較高,可僅配置動(dòng)作執行層組件,應用程序直接調用動(dòng)作執行層的API進(jìn)行數據的檢過(guò)和更新等操作。

(1)JDBC接口層

如前文所述是可選組件,旨在為應用程序提供一個(gè)標準的DB調用接口。

(2)SQL解釋層

本DB組件實(shí)現的SQL解釋層,只實(shí)現了標準SQL的一個(gè)小子集,主要完成select、delete、insert、update、create table、drop table等功能。其中數據操作語(yǔ)句(select、delete、insert、update)的解釋要點(diǎn)之一是where條件子句的解釋執行,類(lèi)似于數學(xué)表達式求值算法。本文采用簡(jiǎn)單直觀(guān)的“算符優(yōu)先法”。該算法使用兩個(gè)工作棧,一個(gè)稱(chēng)作OPTR棧,用以寄存運算符;另一個(gè)稱(chēng)作OPND棧,用以寄存操作數或運算結果。算法的基本思想是:

①首先置操作數棧為空,表達式起始符“#”為運算棧的棧底元素;

②依此讀入表達式中每個(gè)Token。若是操作數,則進(jìn)OPND棧adk是運算符,則和OPTR棧的棧頂運算符比較優(yōu)先權后作相應操作,直至整個(gè)表達式求值完畢(即OPTR棧的棧頂元素和當前讀入的Token均為“#”。

本文實(shí)現的SQL子集描述如下:

預定義

DataConst>:=QUOTE>日期>QUOTE>

StrConst>:=QUOTE>SQL轉義文字>QUOTE>

Const>:=field>[,field>[,field>[…]]]

valuelist>:=Const>[,Const>[…] ]]

compare>:= =│==│!=│>│>│>=││=

setlist>:=setitem>[,setitem>[,setitem>[…]]]

統計函數名>:=MIN│MAX│COUNT│SUM

統計函數>:=統計函數>(field>)

統計list>:=統計函數>,[,統計函數>[,統計函數>[…]]]

數據類(lèi)型>:=INT│UNMBER│CHAR│DATE

Where文> :=文遞歸定義式

Where文>:=(Where>)

Where文>:=NOTWhere文>

Where文>:=Where文>ORWhere文>

Where文>:=Where文>ANDWhere文>

SQL文定義式

①SELECT*|fieldlist>FROMtable>[WHEREWhere文>][ORDER BYfield>[ASC|DESC]]

②SELECT統計list>FROMtable>[WHEREWhere文>]

③UPDATEtable>SETsetlist>[WHEREWhere文>]

④INSERT INTOtable>[(fieldlist>)]VALUES(valuelist>)

⑤DELETE FROMtable>[WHEREWhere文>]

⑥CREATE TABLEtable>(field>數據類(lèi)型>[,field>數據類(lèi)型>[,field>數據類(lèi)型>[…]]])

⑦DROP TABLEtable>

注:|表示多選個(gè),>表示某定義項目,[]表示可選項目,…代表循環(huán)省略表示。

(3)動(dòng)作執行層

動(dòng)作執行層是整個(gè)DB組件的核心和關(guān)鍵,因為所有的DB操作最終都由該層完成,同時(shí)用戶(hù)也可以跳過(guò)上面的兩層,直接調用該層的API,以實(shí)現相同的數據操作功能。下面介紹其主要設計要點(diǎn)和思路。

2.3 數據的表達與存儲

由于嵌入式系統的資源十分有限,不能引入復雜的算法和數據存儲格式,同時(shí)由于Java對二進(jìn)制數據的處理十分不便,本文最終采用CSV格式來(lái)保存表數據。其要點(diǎn)是:

①各字段數據之間采用「,」分開(kāi);

②如果字段數據本身包含有「,」,則將整個(gè)字段數據用引號「」括起來(lái);

③如果字段數據本身包含有引號「”」,則將引號「”」改寫(xiě)為兩個(gè)重疊的引號「””」,依次類(lèi)推。其次,每個(gè)記錄占文本文件的個(gè)行,每一個(gè)數據表與一個(gè)物理數據文件一一對應。

采用這種方式處理的優(yōu)點(diǎn)是:

①全部數據都是采用字符串保存,Java處理起來(lái)十分方便;

②對不定長(cháng)字段的保存處理與定長(cháng)字段處理統一,不需要額外的附加處理,而且存儲效率高;

③對多字節文字的處理程序不需要額外的編碼轉換處理,由JVM平臺本身的功能可以自動(dòng)完成。

當然,采用這種處理方式也存在其不足之處:

①由于在數據文件中,每條記錄的長(cháng)度不定,數據即使局部更新,也必須重寫(xiě)整個(gè)文件;

②由于同樣原因,單條記錄的檢索難于直接定位,而必須讀入整個(gè)數據文件。

為彌補由此產(chǎn)生的性能下降,本文采用數據Cache加以克服。也就是說(shuō),盡可能將數據緩存在內存中,通過(guò)減少對物理文件的讀寫(xiě)操作來(lái)提高數據的性能。

2.4 多線(xiàn)程數據存取的同步與互斥

在Java虛擬機環(huán)境下,沒(méi)有多進(jìn)程的概念,但對于多任務(wù)的處理提供了多線(xiàn)程的手段。本DB引擎組件是公共組件,供上層多個(gè)應用程序組件共同使用。由于上層的每個(gè)應用程序組件本身由一個(gè)或數個(gè)線(xiàn)程來(lái)執行,因此,DB引擎組件必須考慮多個(gè)線(xiàn)程同時(shí)存取某個(gè)數據時(shí)可能引起的沖突問(wèn)題。對于該問(wèn)題的解決辦法,一般是采用DB鎖定的方法。關(guān)于DB鎖定,進(jìn)一步細分的話(huà),可區分為讀鎖和寫(xiě)鎖;根據鎖定粒度的粗細可分為按表鎖、按Page鎖、按記錄鎖等,不一而足。

為設計和實(shí)現的簡(jiǎn)單起見(jiàn),本DB引擎組件提供按表鎖定的方式,同時(shí)不區分讀寫(xiě)鎖之間的區別。這樣,大大簡(jiǎn)化了SQL語(yǔ)句的分析和處理過(guò)程,并且可以直接把鎖定操作與表的open操作相關(guān)聯(lián),鎖解除與表的close操作相關(guān)聯(lián)。實(shí)現時(shí),對應表對象Table的每一個(gè)實(shí)例,設置一個(gè)field變量,用于保存鎖定狀態(tài),再利用Java語(yǔ)言提供的synchronized手段同,可以較為方便地實(shí)現數據表的鎖定功能。代表示例如下:

//表鎖定。為了避免死鎖,有超時(shí)判斷邏輯

synchronized void lock()throws DBError{

long t2,t1;

t1=System.currentTimeMillis();

//由于可能出現在wait語(yǔ)句被喚醒而卻得不到表鎖的情況,為提高超時(shí)邏輯判斷精度,采用循環(huán)

while(isLocked){

try{

wait(DBError.TIMEOUT/10);

}catch(Exception e){e.printStackTrace();}

//超時(shí)判斷

t2=System.currentTimeMillis();

if(t2-t1>DBError.TIMEOUT)break;

}

//發(fā)生超時(shí)退出循環(huán)情況,拋出例外

if(isLocked){

throw new DBError(DBError.TIMEOUT_ERR,name);

}

//設定鎖定標志

isLocked=true;

}

//表打開(kāi)操作

//參數ro只讀打開(kāi)標志

void open(Boolean ro)throws DBError{

lock();

readOnly=ro;

//表數據讀入

load();

}

//表關(guān)閉操作(同時(shí)釋放鎖)

public synchronized void close() throws DBError{

if(isLocked==false)return;

//關(guān)閉前,保存數據

if(isDirty)save();

if(isUnload)unload();

//釋放鎖,通知其它等待線(xiàn)程

isLocked=false;

notify();

}

圖3 DB引擎組件主要類(lèi)的關(guān)系

2.5 DB組件實(shí)現的結構設計

圖3所示為DB引擎組件的主要類(lèi)之間的關(guān)系。其中,Database為類(lèi),用于描述和管理整個(gè)數據庫對象Table為數據表類(lèi),用于描述和管理表對象;TableData用于描述和管理保存表數據的物理介質(zhì)(文件);Field為字段類(lèi),用于描述和管理字段類(lèi)型信息;Record為記錄類(lèi),描述一條數據記錄。為簡(jiǎn)化處理,本組件將Database類(lèi)設計為singleton模式,即本組件只能創(chuàng )建一個(gè)Database實(shí)例。這對于嵌入式系統來(lái)說(shuō),大部分場(chǎng)合已經(jīng)足夠。與數據庫的一般物理概念相對應,1個(gè)Database實(shí)例包含n個(gè)Table實(shí)例,1個(gè)Table實(shí)例包含n個(gè)Field實(shí)例。同時(shí),1個(gè)Table實(shí)例包含1個(gè)TableData實(shí)例,1個(gè)TableData實(shí)例包含n個(gè)Record實(shí)例。

Connection類(lèi)用于管理用戶(hù)訪(fǎng)問(wèn)數據庫的會(huì )話(huà)(Session)過(guò)程。對應一個(gè)用戶(hù)的一次會(huì )話(huà)過(guò)程,生成一個(gè)Connection實(shí)例。Connection類(lèi)對象保存著(zhù)當前Session打開(kāi)的Table列表,當用戶(hù)提交執行某SQL語(yǔ)句而需要鎖定某個(gè)Table時(shí),系統首先檢查該表是否已經(jīng)在當前Session已打開(kāi)的Table列表中。如果已經(jīng)被打開(kāi),則不需要進(jìn)行重復的鎖定操作,直接反回對應的Table對象實(shí)例。反之,如果尚未包含在打開(kāi)的Table列表中,表明當前Session尚未打開(kāi)和鎖定該表,必須執行該表的打開(kāi)和鎖定操作(如果該表已被其它Session打開(kāi),則必須等待到其它Session翻放該表為止)。

本DB組件還支持commit與rollback事務(wù)處理。能夠在如此微小的DB組件實(shí)現事務(wù)處理,主要得益于上述的Session管理框架。在Table類(lèi)commit與rollback處理基礎上,當一個(gè)Session執行commit或rollback操作時(shí),對包含在打開(kāi)列表中的每個(gè)Table實(shí)例,調用執行相應的commit或rollback處理即可。

3 結語(yǔ)與展望

本DB組件已實(shí)際運行了大約兩年時(shí)間。這期間除了對該組件進(jìn)行一些功能追加以外,主體框架上基本保持不變,從而在一定程序上表明了該設計框架的可行性和合理性。該組件編譯以后,class文件形成的jar包大小約為68KB,短小精度悍,便于使用。當然,該DB組件目前仍然存在一些不足:首先,較為關(guān)鍵的一點(diǎn)是速度問(wèn)題。一直以來(lái),Java的執行速度問(wèn)題就是受批語(yǔ)的缺點(diǎn)所在,因此采用它實(shí)現自然也避免不了這人瓶頸。今后改進(jìn)的思路之一是,將其中Java處理效率不高的部分移出Java,采用C實(shí)現;二者通過(guò)JNI手段加以連接,以提高總體的運行速度。第二點(diǎn)需要改進(jìn)的地方是表鎖定的粒度問(wèn)題。由于目前只能整個(gè)表進(jìn)行鎖定,并且不區分讀鎖定與寫(xiě)鎖定,因此粒度較粗。雖然這樣實(shí)現起來(lái)較為簡(jiǎn)單,但在多任務(wù)處理環(huán)境中可能增加不必要的時(shí)間等待。最后,JDBC接口的實(shí)現目前還不完全,需要加以完善。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>