引言
隨著嵌入式系統(tǒng)CPU硬件從8位到32位的發(fā)展,嵌入式系統(tǒng)軟件的開(kāi)發(fā)環(huán)境也得到迅猛的發(fā)展,編程語(yǔ)言從10多年以前的匯編為主流發(fā)展到現(xiàn)在C、C++、Java為主流。另外,面向?qū)ο笤O(shè)計(jì)技術(shù)、組件技術(shù)等在嵌入式系統(tǒng)軟件設(shè)計(jì)中的應(yīng)用也日益引起人們的重視。
在嵌入式系統(tǒng)軟件開(kāi)發(fā)領(lǐng)域,Java是一門較新的異軍突起的編程語(yǔ)言。其優(yōu)點(diǎn)是語(yǔ)言本身簡(jiǎn)潔優(yōu)美,完全按照面向?qū)ο笏枷朐O(shè)計(jì),并且語(yǔ)言引入許多較為先進(jìn)的特性,如多線程、自動(dòng)內(nèi)存管理和垃圾回收,非常適合于大規(guī)模復(fù)雜軟件系統(tǒng)的開(kāi)發(fā)。其不足點(diǎn)是與硬件結(jié)合不夠緊密,同時(shí)代碼運(yùn)行速度較慢。此外,對(duì)于內(nèi)存的使用,程序難于管理和控制。
由于采用Java編程具有如上所述的眾多優(yōu)點(diǎn),越來(lái)越多的嵌入式系統(tǒng)采用Java技術(shù)來(lái)構(gòu)造軟件系統(tǒng)。本文在介紹基于日本某自動(dòng)售貨機(jī)產(chǎn)品的控制板的Java運(yùn)行平臺(tái)基礎(chǔ)上,詳細(xì)討論筆者為其平臺(tái)開(kāi)發(fā)的DB引擎的組成和設(shè)計(jì)思路。
1 Java運(yùn)行環(huán)境平臺(tái)
圖1所示為Java運(yùn)行環(huán)境的總體框架示意圖。本系統(tǒng)為克服Java的解釋執(zhí)行機(jī)制所引起的執(zhí)行速度慢的問(wèn)題,在硬件上采用了Sun公司開(kāi)發(fā)的Pico Java芯片。它能夠直接執(zhí)行Java的二進(jìn)制代碼,使Java的執(zhí)行速度提高一個(gè)數(shù)量級(jí)以上。在硬件層的上面是OS層,本系統(tǒng)采用的是ITRON(日本東京大學(xué)坂村鍵教授設(shè)計(jì)的一種嵌入式操作系統(tǒng),雖然在日本以外的市場(chǎng)影響不大,但在日本本地市場(chǎng),占有率達(dá)90%以上)。由于ITRON規(guī)格制定得比較早,并且為兼顧低端嵌入式應(yīng)用的場(chǎng)合,ITRON總體上功能比較簡(jiǎn)單,并未把諸如TCP/IP、文件系統(tǒng)等內(nèi)容包含在其里面,因此與嵌入式Linux等不一樣的是,TCP/IP、文件系統(tǒng)是以獨(dú)立的組件形式存在的。在OS層的上面是JVM層。與其它一般Java虛擬機(jī)不同的是,本系統(tǒng)的Java執(zhí)行代碼不需要由JVM解釋執(zhí)行,而是由CPU硬件直接執(zhí)行。在JVM的上層是自動(dòng)售貨機(jī)的基礎(chǔ)平臺(tái)類庫(kù)和公共組件層。本文介紹的DB引擎組件正是處于這一層。該層的上面是應(yīng)用程序?qū)?,用于?shí)現(xiàn)自動(dòng)售貨機(jī)的各種控制、管理機(jī)能。
2 嵌入式系統(tǒng)DB引擎
2.1 DB引擎組件的引入
眾所周知,在臺(tái)式機(jī)領(lǐng)域,DB是一個(gè)十分關(guān)鍵的基礎(chǔ)軟件。以往嵌入式系統(tǒng)的軟件可能更側(cè)重于與硬件的交互與控制,但隨著對(duì)嵌入式系統(tǒng)功能需求的日益復(fù)雜化,嵌入式系統(tǒng)軟件中,信息、數(shù)據(jù)的保存與管理的比重也日益增加。在這樣的背景下,嵌入式系統(tǒng)軟件開(kāi)發(fā)中,通過(guò)引入DB組件,對(duì)實(shí)現(xiàn)軟件整體框架結(jié)構(gòu)的組件化與簡(jiǎn)單化,有著十分明顯而重要的意義。
2.2 DB引擎組件的總體框架
如圖2所示,將整個(gè)DB組件設(shè)計(jì)為3層結(jié)構(gòu),分別為JDBC接口層、SQL解釋層和動(dòng)作執(zhí)行層。這3層之間呈單向依賴關(guān)系。也就是說(shuō),SQL解釋層依賴于動(dòng)作執(zhí)行層,但動(dòng)作執(zhí)行層不依賴于其上面的兩層,可以單獨(dú)存在而直接被使用。如果用戶以使用方便為主要目的,可采用完全配置方式,應(yīng)用程序通過(guò)JDBC接口層存取數(shù)據(jù)。反之,如果用戶對(duì)空間和效率要求較高,可僅配置動(dòng)作執(zhí)行層組件,應(yīng)用程序直接調(diào)用動(dòng)作執(zhí)行層的API進(jìn)行數(shù)據(jù)的檢過(guò)和更新等操作。
(1)JDBC接口層
如前文所述是可選組件,旨在為應(yīng)用程序提供一個(gè)標(biāo)準(zhǔn)的DB調(diào)用接口。
(2)SQL解釋層
本DB組件實(shí)現(xiàn)的SQL解釋層,只實(shí)現(xiàn)了標(biāo)準(zhǔn)SQL的一個(gè)小子集,主要完成select、delete、insert、update、create table、drop table等功能。其中數(shù)據(jù)操作語(yǔ)句(select、delete、insert、update)的解釋要點(diǎn)之一是where條件子句的解釋執(zhí)行,類似于數(shù)學(xué)表達(dá)式求值算法。本文采用簡(jiǎn)單直觀的“算符優(yōu)先法”。該算法使用兩個(gè)工作棧,一個(gè)稱作OPTR棧,用以寄存運(yùn)算符;另一個(gè)稱作OPND棧,用以寄存操作數(shù)或運(yùn)算結(jié)果。算法的基本思想是:
①首先置操作數(shù)棧為空,表達(dá)式起始符“#”為運(yùn)算棧的棧底元素;
②依此讀入表達(dá)式中每個(gè)Token。若是操作數(shù),則進(jìn)OPND棧adk是運(yùn)算符,則和OPTR棧的棧頂運(yùn)算符比較優(yōu)先權(quán)后作相應(yīng)操作,直至整個(gè)表達(dá)式求值完畢(即OPTR棧的棧頂元素和當(dāng)前讀入的Token均為“#”。
本文實(shí)現(xiàn)的SQL子集描述如下:
預(yù)定義
<日期>
<統(tǒng)計(jì)函數(shù)名>:=MIN│MAX│COUNT│SUM
<統(tǒng)計(jì)函數(shù)>:=<統(tǒng)計(jì)函數(shù)>(
<統(tǒng)計(jì)list>:=<統(tǒng)計(jì)函數(shù)>,[,<統(tǒng)計(jì)函數(shù)>[,<統(tǒng)計(jì)函數(shù)>[…]]]
<數(shù)據(jù)類型>:=INT│UNMBER│CHAR│DATE
SQL文定義式
①SELECT*| ②SELECT<統(tǒng)計(jì)list>FROM ③UPDATE ④INSERT INTO ⑤DELETE FROM ⑥CREATE TABLE ⑦DROP TABLE 注:|表示多選個(gè),<>表示某定義項(xiàng)目,[]表示可選項(xiàng)目,…代表循環(huán)省略表示。 (3)動(dòng)作執(zhí)行層 動(dòng)作執(zhí)行層是整個(gè)DB組件的核心和關(guān)鍵,因?yàn)樗械腄B操作最終都由該層完成,同時(shí)用戶也可以跳過(guò)上面的兩層,直接調(diào)用該層的API,以實(shí)現(xiàn)相同的數(shù)據(jù)操作功能。下面介紹其主要設(shè)計(jì)要點(diǎn)和思路。 2.3 數(shù)據(jù)的表達(dá)與存儲(chǔ) 由于嵌入式系統(tǒng)的資源十分有限,不能引入復(fù)雜的算法和數(shù)據(jù)存儲(chǔ)格式,同時(shí)由于Java對(duì)二進(jìn)制數(shù)據(jù)的處理十分不便,本文最終采用CSV格式來(lái)保存表數(shù)據(jù)。其要點(diǎn)是: ①各字段數(shù)據(jù)之間采用「,」分開(kāi); ②如果字段數(shù)據(jù)本身包含有「,」,則將整個(gè)字段數(shù)據(jù)用引號(hào)「」括起來(lái); ③如果字段數(shù)據(jù)本身包含有引號(hào)「”」,則將引號(hào)「”」改寫(xiě)為兩個(gè)重疊的引號(hào)「””」,依次類推。其次,每個(gè)記錄占文本文件的個(gè)行,每一個(gè)數(shù)據(jù)表與一個(gè)物理數(shù)據(jù)文件一一對(duì)應(yīng)。 采用這種方式處理的優(yōu)點(diǎn)是: ①全部數(shù)據(jù)都是采用字符串保存,Java處理起來(lái)十分方便; ②對(duì)不定長(zhǎng)字段的保存處理與定長(zhǎng)字段處理統(tǒng)一,不需要額外的附加處理,而且存儲(chǔ)效率高; ③對(duì)多字節(jié)文字的處理程序不需要額外的編碼轉(zhuǎn)換處理,由JVM平臺(tái)本身的功能可以自動(dòng)完成。 當(dāng)然,采用這種處理方式也存在其不足之處: ①由于在數(shù)據(jù)文件中,每條記錄的長(zhǎng)度不定,數(shù)據(jù)即使局部更新,也必須重寫(xiě)整個(gè)文件; ②由于同樣原因,單條記錄的檢索難于直接定位,而必須讀入整個(gè)數(shù)據(jù)文件。 為彌補(bǔ)由此產(chǎn)生的性能下降,本文采用數(shù)據(jù)Cache加以克服。也就是說(shuō),盡可能將數(shù)據(jù)緩存在內(nèi)存中,通過(guò)減少對(duì)物理文件的讀寫(xiě)操作來(lái)提高數(shù)據(jù)的性能。 2.4 多線程數(shù)據(jù)存取的同步與互斥 在Java虛擬機(jī)環(huán)境下,沒(méi)有多進(jìn)程的概念,但對(duì)于多任務(wù)的處理提供了多線程的手段。本DB引擎組件是公共組件,供上層多個(gè)應(yīng)用程序組件共同使用。由于上層的每個(gè)應(yīng)用程序組件本身由一個(gè)或數(shù)個(gè)線程來(lái)執(zhí)行,因此,DB引擎組件必須考慮多個(gè)線程同時(shí)存取某個(gè)數(shù)據(jù)時(shí)可能引起的沖突問(wèn)題。對(duì)于該問(wèn)題的解決辦法,一般是采用DB鎖定的方法。關(guān)于DB鎖定,進(jìn)一步細(xì)分的話,可區(qū)分為讀鎖和寫(xiě)鎖;根據(jù)鎖定粒度的粗細(xì)可分為按表鎖、按Page鎖、按記錄鎖等,不一而足。 為設(shè)計(jì)和實(shí)現(xiàn)的簡(jiǎn)單起見(jiàn),本DB引擎組件提供按表鎖定的方式,同時(shí)不區(qū)分讀寫(xiě)鎖之間的區(qū)別。這樣,大大簡(jiǎn)化了SQL語(yǔ)句的分析和處理過(guò)程,并且可以直接把鎖定操作與表的open操作相關(guān)聯(lián),鎖解除與表的close操作相關(guān)聯(lián)。實(shí)現(xiàn)時(shí),對(duì)應(yīng)表對(duì)象Table的每一個(gè)實(shí)例,設(shè)置一個(gè)field變量,用于保存鎖定狀態(tài),再利用Java語(yǔ)言提供的synchronized手段同,可以較為方便地實(shí)現(xiàn)數(shù)據(jù)表的鎖定功能。代表示例如下: //表鎖定。為了避免死鎖,有超時(shí)判斷邏輯 synchronized void lock()throws DBError{ long t2,t1; t1=System.currentTimeMillis(); //由于可能出現(xiàn)在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); } //設(shè)定鎖定標(biāo)志 isLocked=true; } //表打開(kāi)操作 //參數(shù)ro只讀打開(kāi)標(biāo)志 void open(Boolean ro)throws DBError{ lock(); readOnly=ro; //表數(shù)據(jù)讀入 load(); } //表關(guān)閉操作(同時(shí)釋放鎖) public synchronized void close() throws DBError{ if(isLocked==false)return; //關(guān)閉前,保存數(shù)據(jù) if(isDirty)save(); if(isUnload)unload(); //釋放鎖,通知其它等待線程 isLocked=false; notify(); } 圖3所示為DB引擎組件的主要類之間的關(guān)系。其中,Database為數(shù)據(jù)庫(kù)類,用于描述和管理整個(gè)數(shù)據(jù)庫(kù)對(duì)象Table為數(shù)據(jù)表類,用于描述和管理表對(duì)象;TableData用于描述和管理保存表數(shù)據(jù)的物理介質(zhì)(文件);Field為字段類,用于描述和管理字段類型信息;Record為記錄類,描述一條數(shù)據(jù)記錄。為簡(jiǎn)化處理,本組件將Database類設(shè)計(jì)為singleton模式,即本組件只能創(chuàng)建一個(gè)Database實(shí)例。這對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),大部分場(chǎng)合已經(jīng)足夠。與數(shù)據(jù)庫(kù)的一般物理概念相對(duì)應(yī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類用于管理用戶訪問(wèn)數(shù)據(jù)庫(kù)的會(huì)話(Session)過(guò)程。對(duì)應(yīng)一個(gè)用戶的一次會(huì)話過(guò)程,生成一個(gè)Connection實(shí)例。Connection類對(duì)象保存著當(dāng)前Session打開(kāi)的Table列表,當(dāng)用戶提交執(zhí)行某SQL語(yǔ)句而需要鎖定某個(gè)Table時(shí),系統(tǒng)首先檢查該表是否已經(jīng)在當(dāng)前Session已打開(kāi)的Table列表中。如果已經(jīng)被打開(kāi),則不需要進(jìn)行重復(fù)的鎖定操作,直接反回對(duì)應(yīng)的Table對(duì)象實(shí)例。反之,如果尚未包含在打開(kāi)的Table列表中,表明當(dāng)前Session尚未打開(kāi)和鎖定該表,必須執(zhí)行該表的打開(kāi)和鎖定操作(如果該表已被其它Session打開(kāi),則必須等待到其它Session翻放該表為止)。 本DB組件還支持commit與rollback事務(wù)處理。能夠在如此微小的DB組件實(shí)現(xiàn)事務(wù)處理,主要得益于上述的Session管理框架。在Table類commit與rollback處理基礎(chǔ)上,當(dāng)一個(gè)Session執(zhí)行commit或rollback操作時(shí),對(duì)包含在打開(kāi)列表中的每個(gè)Table實(shí)例,調(diào)用執(zhí)行相應(yīng)的commit或rollback處理即可。 3 結(jié)語(yǔ)與展望 本DB組件已實(shí)際運(yùn)行了大約兩年時(shí)間。這期間除了對(duì)該組件進(jìn)行一些功能追加以外,主體框架上基本保持不變,從而在一定程序上表明了該設(shè)計(jì)框架的可行性和合理性。該組件編譯以后,class文件形成的jar包大小約為68KB,短小精度悍,便于使用。當(dāng)然,該DB組件目前仍然存在一些不足:首先,較為關(guān)鍵的一點(diǎn)是速度問(wèn)題。一直以來(lái),Java的執(zhí)行速度問(wèn)題就是受批語(yǔ)的缺點(diǎn)所在,因此采用它實(shí)現(xiàn)自然也避免不了這人瓶頸。今后改進(jìn)的思路之一是,將其中Java處理效率不高的部分移出Java,采用C實(shí)現(xiàn);二者通過(guò)JNI手段加以連接,以提高總體的運(yùn)行速度。第二點(diǎn)需要改進(jìn)的地方是表鎖定的粒度問(wèn)題。由于目前只能整個(gè)表進(jìn)行鎖定,并且不區(qū)分讀鎖定與寫(xiě)鎖定,因此粒度較粗。雖然這樣實(shí)現(xiàn)起來(lái)較為簡(jiǎn)單,但在多任務(wù)處理環(huán)境中可能增加不必要的時(shí)間等待。最后,JDBC接口的實(shí)現(xiàn)目前還不完全,需要加以完善。 相關(guān)推薦[WHERE
[WHERE
SET
[(
[WHERE
(
圖3 DB引擎組件主要類的關(guān)系
2.5 DB組件實(shí)現(xiàn)的結(jié)構(gòu)設(shè)計(jì)
Java與'嵌入式' PostgreSQL數(shù)據(jù)庫(kù)單元測(cè)試的相關(guān)資料分享
Java在嵌入式應(yīng)用開(kāi)發(fā)扮演什么角色
Java開(kāi)發(fā)和嵌入式開(kāi)發(fā)
Java技術(shù)在嵌入式系統(tǒng)中的應(yīng)用是什么
嵌入式數(shù)據(jù)庫(kù)Sqlite在嵌入式工控平板電腦中的使用
嵌入式數(shù)據(jù)庫(kù)msql在Linux下有哪些應(yīng)用?
嵌入式數(shù)據(jù)庫(kù)sqlite移植及使用的資料分享
嵌入式數(shù)據(jù)庫(kù)有哪些應(yīng)用實(shí)例?
嵌入式數(shù)據(jù)庫(kù)的作用是什么
嵌入式數(shù)據(jù)庫(kù)相關(guān)資料下載
嵌入式Linux應(yīng)用開(kāi)發(fā)詳解 光盤(pán)
嵌入式Linux系統(tǒng)基礎(chǔ)概念講解
嵌入式QT是什么?有何功能
嵌入式SQL的相關(guān)資料分享
嵌入式Web技術(shù)在無(wú)紙記錄儀中的應(yīng)用研究
嵌入式為什么比JAVA、.Net好?
嵌入式云計(jì)算與視頻大數(shù)據(jù)——基于TI嵌入式處理器
嵌入式實(shí)時(shí)數(shù)據(jù)庫(kù)基本特性是什么?有哪些應(yīng)用領(lǐng)域?
嵌入式工作有哪些分類?
嵌入式常用的開(kāi)源庫(kù)是什么
嵌入式移動(dòng)數(shù)據(jù)庫(kù)的關(guān)鍵技術(shù)有哪幾種?
嵌入式系統(tǒng)中的數(shù)據(jù)存儲(chǔ)和管理的相關(guān)資料分享
嵌入式系統(tǒng)到底該選哪款數(shù)據(jù)庫(kù),SQLite真的是最優(yōu)解嗎?
嵌入式系統(tǒng)是由哪些部分組成的?實(shí)時(shí)嵌入式系統(tǒng)特征有哪些
嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)
嵌入式車載導(dǎo)航信息系統(tǒng)研究
嵌入式軟件仿真開(kāi)發(fā)系統(tǒng)的研究
嵌入式部署或模式的相關(guān)資料分享
Actian Zen(前稱Pervasive PSQL ) 嵌入式數(shù)據(jù)
Android如何使用Db4o數(shù)據(jù)庫(kù)
C語(yǔ)言中使用嵌入式SQL訪問(wèn)Oracle數(shù)據(jù)庫(kù)的方法
C語(yǔ)言實(shí)現(xiàn)程序連接數(shù)據(jù)庫(kù)并實(shí)現(xiàn)簡(jiǎn)單的嵌入式服務(wù)器的方法
Delphi中數(shù)據(jù)庫(kù)引擎BDE介紹
H2嵌入式數(shù)據(jù)庫(kù)有哪幾種使用方式
H2數(shù)據(jù)庫(kù)介紹
Hsqldb數(shù)據(jù)庫(kù)的相關(guān)資料分享
LabVIEW訪問(wèn)SQLite數(shù)據(jù)庫(kù)接口研究
SQLite3嵌入式數(shù)據(jù)庫(kù)arm+linux移植的相關(guān)資料下載
Sqlite移動(dòng)嵌入式數(shù)據(jù)庫(kù)Sqlite的日常SQL操作語(yǔ)句是什么?
Wince系統(tǒng)基于數(shù)據(jù)庫(kù)Sqlite的應(yīng)用
labview與嵌入式數(shù)據(jù)庫(kù)sqlite數(shù)據(jù)庫(kù)的連接
【上?!空\(chéng)聘高級(jí)數(shù)據(jù)庫(kù)開(kāi)發(fā)工程師
一款基于Java實(shí)現(xiàn)的小巧而強(qiáng)大的關(guān)系型數(shù)據(jù)庫(kù)
為什么要選擇嵌入式內(nèi)存數(shù)據(jù)庫(kù)引擎?
介紹一款A(yù)RM 32位嵌入式平臺(tái)優(yōu)化Java SE
作為研究生自學(xué)嵌入式如何?以及嵌入式的發(fā)展。
使用Java平臺(tái)怎么實(shí)現(xiàn)可編程嵌入式系統(tǒng)?
做IT開(kāi)發(fā),選擇嵌入式好還是JAVA好?
哪種嵌入式數(shù)據(jù)庫(kù)支持pointer-based網(wǎng)絡(luò)模型?
在Spring框架中配置嵌入式數(shù)據(jù)庫(kù)引擎
基于Java平臺(tái)的可編程嵌入式系統(tǒng)設(shè)計(jì)
基于嵌入式Linux/Qt 開(kāi)發(fā)RFID智能倉(cāng)儲(chǔ)指紋管理系統(tǒng)
基于嵌入式實(shí)時(shí)操作系統(tǒng)MQX的內(nèi)核分析及應(yīng)用研究
基于組件的嵌入式移動(dòng)數(shù)據(jù)庫(kù)怎么實(shí)現(xiàn)?
如何選擇neo4j的嵌入式和驅(qū)動(dòng)包模式
山西嵌入式linux就業(yè)培訓(xùn)班之TimesTen創(chuàng)建數(shù)據(jù)庫(kù)
工業(yè)嵌入式計(jì)算平臺(tái)開(kāi)發(fā)招聘
怎么解決移動(dòng)數(shù)據(jù)庫(kù)的斷接問(wèn)題?
怎樣去實(shí)現(xiàn)嵌入式移動(dòng)數(shù)據(jù)庫(kù)的查詢優(yōu)化?
怎樣將sqlite3數(shù)據(jù)庫(kù)交叉編譯并移植到嵌入式開(kāi)發(fā)板上去呢
掌握嵌入式Linux操作的使用
請(qǐng)問(wèn)嵌入式設(shè)備上如何構(gòu)建自己的數(shù)據(jù)庫(kù)?
請(qǐng)問(wèn)怎樣去設(shè)計(jì)嵌入式Linux組態(tài)軟件實(shí)時(shí)數(shù)據(jù)庫(kù)?
跨平臺(tái)嵌入式數(shù)據(jù)庫(kù)EffiProz介紹
ODX 診斷數(shù)據(jù)庫(kù)轉(zhuǎn)換工具 — DDC
Java 技術(shù)在嵌入式系統(tǒng)中的應(yīng)用
17
嵌入式移動(dòng)數(shù)據(jù)庫(kù)研究
14
嵌入式移動(dòng)數(shù)據(jù)庫(kù)應(yīng)用研究
24
JAVA在SQLite嵌入式數(shù)據(jù)庫(kù)中的應(yīng)用
19
基于SOC技術(shù)的智能型嵌入式數(shù)據(jù)庫(kù)研究
16
嵌入式數(shù)據(jù)庫(kù)系統(tǒng)在ACR中的應(yīng)用研究
29
嵌入式Java運(yùn)行平臺(tái)數(shù)據(jù)庫(kù)引擎的應(yīng)用設(shè)計(jì)
25
嵌入式數(shù)據(jù)庫(kù)的應(yīng)用
1023
#硬聲創(chuàng)作季 嵌入式基礎(chǔ):嵌入式數(shù)據(jù)庫(kù)的訪問(wèn)視頻
嵌入式數(shù)據(jù)庫(kù)發(fā)展?fàn)顩r研究
781
一種新的嵌入式內(nèi)存數(shù)據(jù)庫(kù)的設(shè)計(jì)
0
嵌入式數(shù)據(jù)庫(kù)在Java中的應(yīng)用解析
0
一種新的嵌入式內(nèi)存數(shù)據(jù)庫(kù)的設(shè)計(jì)方法
350
嵌入式數(shù)據(jù)庫(kù)mSQL在Linux下的應(yīng)用
454
嵌入式數(shù)據(jù)庫(kù)
13
H2:一款基于 Java 的嵌入式關(guān)系型數(shù)據(jù)庫(kù)
1
Spring嵌入式數(shù)據(jù)庫(kù)示例
1
評(píng)論