Perst嵌入式數(shù)據(jù)庫存儲結構分析與研究
引言
Perst是McObject公司發(fā)布的一款非常袖珍的開源嵌入式數(shù)據(jù)庫,是一個簡單,快速,便捷,面向?qū)ο?,適合java與.Net的數(shù)據(jù)庫。Perst不需要專門的編譯器與預處理器,支持ACID事務[2]。對于在資源受限的移動設備(如手機,PDA等)上存儲大量數(shù)據(jù)和對數(shù)據(jù)進行頻繁的I/O操作往往要消耗很多的設備資源。由于移動設備內(nèi)存小,性能較差,如果采用關系數(shù)據(jù)庫(如 SQLServer2000,Oracle)管理數(shù)據(jù),僅靠其有限的內(nèi)存資源是不能運行這些數(shù)據(jù)庫管理系統(tǒng)的,這樣就有必要采用一些特殊的數(shù)據(jù)庫系統(tǒng)。 Perst數(shù)據(jù)庫正是為這類設備研究開發(fā)的,它們是如何在資源受限的設備上完成大量數(shù)據(jù)的訪問操作。其實這些設備的系統(tǒng)資源主要消耗在從磁盤上讀取數(shù)據(jù)的 I/O操作。如何提供一種有效的文件存儲策略來降低對磁盤的I/O操作是嵌入式數(shù)據(jù)庫軟件設計的主要任務。文章將著重介紹Perst嵌入式數(shù)據(jù)庫的文件存儲策略和B+樹索引結構[3]。
1 Perst基本概念介紹
1.1 頁Page
Perst對數(shù)據(jù)庫文件的基本操作都是以頁為單位進行的。這些基本操作包括:內(nèi)存分配,從數(shù)據(jù)庫文件中讀取數(shù)據(jù),將內(nèi)存中的數(shù)據(jù)寫入文件等。Perst一頁默認的大小是4K。
1.2 對象標識符OID
Perst創(chuàng)建的每個對象都是可以持久化的,即它可以被保存在數(shù)據(jù)庫文件中。每個持久化的對象都會用對象標識符(OID)引用,通過對象標識符,程序可以從數(shù)據(jù)庫文件中找到該對象在文件中實際存放位置。
1.3 Root Object
Perst的每個數(shù)據(jù)庫文件都必須有且只能有一個稱作Root Object的類。在這個類中定義了數(shù)據(jù)庫文件中的所有索引結構。通過這個類,程序可以定位到數(shù)據(jù)庫文件中的所有記錄對象。
2 數(shù)據(jù)庫Header信息的存儲格式
Perst數(shù)據(jù)庫文件開始的第一頁中,前139個字節(jié)存放Perst數(shù)據(jù)庫使用情況和數(shù)據(jù)庫當前狀態(tài)等Header信息。它在文件中的數(shù)據(jù)結構如圖2.1所示。表2.1到2.4對圖2.1中Header信息中的每個數(shù)據(jù)做了詳細分析。數(shù)據(jù)意義如表所示。
圖2.1 數(shù)據(jù)庫的Header信息
表2.1 數(shù)據(jù)庫Header信息前3個字節(jié)意義
01 | 01 | 02 |
1 byte | 1 byte | 1 byte |
root數(shù)組的下標 | 數(shù)據(jù)庫文件被不正常關閉? | 數(shù)據(jù)庫版本 |
表2.2數(shù)組root[0]結構
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 | 最后分配的位圖頁的索引 |
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 | 對象索引中擴展位圖頁的開始 |
數(shù)組root[1]是root[0]的備份,每個元素對應的意義相同
評論