Perst嵌入式數(shù)據(jù)庫(kù)存儲(chǔ)結(jié)構(gòu)分析與研究
引言
Perst是McObject公司發(fā)布的一款非常袖珍的開(kāi)源嵌入式數(shù)據(jù)庫(kù),是一個(gè)簡(jiǎn)單,快速,便捷,面向?qū)ο?,適合java與.Net的數(shù)據(jù)庫(kù)。Perst不需要專(zhuān)門(mén)的編譯器與預(yù)處理器,支持ACID事務(wù)[2]。對(duì)于在資源受限的移動(dòng)設(shè)備(如手機(jī),PDA等)上存儲(chǔ)大量數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行頻繁的I/O操作往往要消耗很多的設(shè)備資源。由于移動(dòng)設(shè)備內(nèi)存小,性能較差,如果采用關(guān)系數(shù)據(jù)庫(kù)(如 SQLServer2000,Oracle)管理數(shù)據(jù),僅靠其有限的內(nèi)存資源是不能運(yùn)行這些數(shù)據(jù)庫(kù)管理系統(tǒng)的,這樣就有必要采用一些特殊的數(shù)據(jù)庫(kù)系統(tǒng)。 Perst數(shù)據(jù)庫(kù)正是為這類(lèi)設(shè)備研究開(kāi)發(fā)的,它們是如何在資源受限的設(shè)備上完成大量數(shù)據(jù)的訪問(wèn)操作。其實(shí)這些設(shè)備的系統(tǒng)資源主要消耗在從磁盤(pán)上讀取數(shù)據(jù)的 I/O操作。如何提供一種有效的文件存儲(chǔ)策略來(lái)降低對(duì)磁盤(pán)的I/O操作是嵌入式數(shù)據(jù)庫(kù)軟件設(shè)計(jì)的主要任務(wù)。文章將著重介紹Perst嵌入式數(shù)據(jù)庫(kù)的文件存儲(chǔ)策略和B+樹(shù)索引結(jié)構(gòu)[3]。
1 Perst基本概念介紹
1.1 頁(yè)P(yáng)age
Perst對(duì)數(shù)據(jù)庫(kù)文件的基本操作都是以頁(yè)為單位進(jìn)行的。這些基本操作包括:內(nèi)存分配,從數(shù)據(jù)庫(kù)文件中讀取數(shù)據(jù),將內(nèi)存中的數(shù)據(jù)寫(xiě)入文件等。Perst一頁(yè)默認(rèn)的大小是4K。
1.2 對(duì)象標(biāo)識(shí)符OID
Perst創(chuàng)建的每個(gè)對(duì)象都是可以持久化的,即它可以被保存在數(shù)據(jù)庫(kù)文件中。每個(gè)持久化的對(duì)象都會(huì)用對(duì)象標(biāo)識(shí)符(OID)引用,通過(guò)對(duì)象標(biāo)識(shí)符,程序可以從數(shù)據(jù)庫(kù)文件中找到該對(duì)象在文件中實(shí)際存放位置。
1.3 Root Object
Perst的每個(gè)數(shù)據(jù)庫(kù)文件都必須有且只能有一個(gè)稱(chēng)作Root Object的類(lèi)。在這個(gè)類(lèi)中定義了數(shù)據(jù)庫(kù)文件中的所有索引結(jié)構(gòu)。通過(guò)這個(gè)類(lèi),程序可以定位到數(shù)據(jù)庫(kù)文件中的所有記錄對(duì)象。
2 數(shù)據(jù)庫(kù)Header信息的存儲(chǔ)格式
Perst數(shù)據(jù)庫(kù)文件開(kāi)始的第一頁(yè)中,前139個(gè)字節(jié)存放Perst數(shù)據(jù)庫(kù)使用情況和數(shù)據(jù)庫(kù)當(dāng)前狀態(tài)等Header信息。它在文件中的數(shù)據(jù)結(jié)構(gòu)如圖2.1所示。表2.1到2.4對(duì)圖2.1中Header信息中的每個(gè)數(shù)據(jù)做了詳細(xì)分析。數(shù)據(jù)意義如表所示。
圖2.1 數(shù)據(jù)庫(kù)的Header信息
表2.1 數(shù)據(jù)庫(kù)Header信息前3個(gè)字節(jié)意義
01 | 01 | 02 |
1 byte | 1 byte | 1 byte |
root數(shù)組的下標(biāo) | 數(shù)據(jù)庫(kù)文件被不正常關(guān)閉? | 數(shù)據(jù)庫(kù)版本 |
表2.2數(shù)組root[0]結(jié)構(gòu)
00 00 00 00 00 01 40 00 | 00 00 00 00 00 00 10 00 | 00 00 00 00 00 00 A0 00 |
8 bytes | 8 bytes | 8 bytes |
database file size | offset of object index | offset of shadow index |
00 00 00 00 00 00 00 00 | 00 00 12 00 | 00 00 12 00 |
8 bytes | 4 bytes | 4 bytes |
size used by objects | size of object index | size of object index |
00 00 10 01 | 00 00 00 00 | 00 00 00 02 |
4 bytes | 4 bytes | 4 bytes |
used part of the index | L1 list of free descriptors | 最后分配的位圖頁(yè)的索引 |
00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
4 bytes | 4 bytes | 4 bytes |
OID of root object | List of class descriptors | 對(duì)象索引中擴(kuò)展位圖頁(yè)的開(kāi)始 |
數(shù)組root[1]是root[0]的備份,每個(gè)元素對(duì)應(yīng)的意義相同
相關(guān)推薦
技術(shù)專(zhuān)區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車(chē)電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論