Perst嵌入式数据库存储结构分析与研究
引言
Perst是McObject公司发布的一款非常袖珍的开源嵌入式数据库,是一个简单,快速,便捷,面向对象,适合java与.Net的数据库。Perst不需要专门的编译器与预处理器,支持ACID事务[2]。对于在资源受限的移动设备(如手机,PDA等)上存储大量数据和对数据进行频繁的I/O操作往往要消耗很多的设备资源。由于移动设备内存小,性能较差,如果采用关系数据库(如 SQLServer2000,Oracle)管理数据,仅靠其有限的内存资源是不能运行这些数据库管理系统的,这样就有必要采用一些特殊的数据库系统。 Perst数据库正是为这类设备研究开发的,它们是如何在资源受限的设备上完成大量数据的访问操作。其实这些设备的系统资源主要消耗在从磁盘上读取数据的 I/O操作。如何提供一种有效的文件存储策略来降低对磁盘的I/O操作是嵌入式数据库软件设计的主要任务。文章将着重介绍Perst嵌入式数据库的文件存储策略和B+树索引结构[3]。
1 Perst基本概念介绍
1.1 页Page
Perst对数据库文件的基本操作都是以页为单位进行的。这些基本操作包括:内存分配,从数据库文件中读取数据,将内存中的数据写入文件等。Perst一页默认的大小是4K。
1.2 对象标识符OID
Perst创建的每个对象都是可以持久化的,即它可以被保存在数据库文件中。每个持久化的对象都会用对象标识符(OID)引用,通过对象标识符,程序可以从数据库文件中找到该对象在文件中实际存放位置。
1.3 Root Object
Perst的每个数据库文件都必须有且只能有一个称作Root Object的类。在这个类中定义了数据库文件中的所有索引结构。通过这个类,程序可以定位到数据库文件中的所有记录对象。
2 数据库Header信息的存储格式
Perst数据库文件开始的第一页中,前139个字节存放Perst数据库使用情况和数据库当前状态等Header信息。它在文件中的数据结构如图2.1所示。表2.1到2.4对图2.1中Header信息中的每个数据做了详细分析。数据意义如表所示。
图2.1 数据库的Header信息
表2.1 数据库Header信息前3个字节意义
01 | 01 | 02 |
1 byte | 1 byte | 1 byte |
root数组的下标 | 数据库文件被不正常关闭? | 数据库版本 |
表2.2数组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 | 对象索引中扩展位图页的开始 |
数组root[1]是root[0]的备份,每个元素对应的意义相同
表2.3 数组root[1]结构
00 00 00 00 00 01 60 00 | 00 00 00 00 00 00 A0 00 | 00 00 00 00 00 00 00 10 00 |
8 bytes | 8 bytes | 8 bytes |
00 00 00 00 00 01 42 80 | 00 00 12 00 | 00 00 12 00 |
8 bytes | 4 bytes | 4 bytes |
00 00 10 08 | 00 00 00 00 | 00 00 00 02 |
4 bytes | 4 bytes | 4 bytes |
00 00 10 01 | 00 00 10 02 | 00 00 00 00 |
4 bytes | 4 bytes | 4 bytes |
表2.4 事务id
00 00 00 00 00 00 00 01 | 8 bytes | 事务id |
数据库文件的第一页(4K)存放了整个数据库文件的Header信息。程序从数据库文件的Header信息中分离出数据库文件的使用情况和索引结构的存储位置,这样可以很快的定位数据库中的记录数据。
3 Perst的Object Index存储结构
Perst专门开辟了一段空间,称Object Index区,存放持久化对象在文件中的实际存储位置。一般这个区在文件的第2-10页,第11-19页存放这个区的备份。第2-9页的数据被标识为空闲文件区,第10页存放实际Object Index。
在Object Index区中,每个元素称为Object Handle,每Object Handle用8个字节表示,存放对应对象在文件中的实际存储位置,即对象的OID。对于4K的页,可以存放512个Object Handles。Object Index区的结构如图3.1所示。
图3.1 Object Index结构图
在图3.1的0x00012000h位置以前都是空闲区,之后的才是真正存放Object Handle的Object Index区。如果Perst数据库文件中的持久化对象的OID个数超过512个,Perst会在数据库文件的另一个区开辟更大的存储空间充当 Object Index区,以存放更多的Object Handle。
4 Perst记录数据及类的存储结构
Perst中记录数据存放位置是根据当前数据库的使用情况来为记录数据分配存储空间。Perst中每个记录数据的存放
- 嵌入式数据库在Java中的应用(03-03)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- SQLite在嵌入式Wince中的应用(07-20)
- 嵌入式数据库SQLite在远程监控系统中的应用(04-09)
- 基于Berkeley DB的机房环境监控系统(01-04)
- 单片机内部存储结构分析(11-23)