资源描述
嵌入式数据库管理系统的设计与功能模块间关系的探究敖 磊 1,任怀志 2(1 大连理工大学城市学院网络工程教研室,辽宁大连 116600;2、沈阳职业技术学院计算机学院,辽宁沈阳 110021)摘要:嵌入式数据库管理系统是最近几年才兴起的一项新的数据管理技术。 它以目前成熟的 数据库技术为基础, 实现了对嵌入式数据库中数据的存储、 组织和管理。 本文详细分析了嵌 入式数据库管理系统中实现的重点和难点。在实现的过程中,充分利用 VxWorks 提供的各 种接口,以提高嵌入式数据库管理系统的效率。关键词: EDBMS ;模块;接口The Design of the network module in the Embedded Database Management System1.AO LEI 2.REN Huai-zhi( 1 City Institute,Dalian University of Technology ,dalian liaoning 116600)(2 shenyang Aeronautical Voation technical lnstiute,shenyang liaoning 110021)Abstract: Embedded database system is an emerging data management technology in recent years. It based on the mature database technologythe specific characteristics for embedded devices; and achieved the data storage, organization and management on embedded database. The thesis analyzed the priorities and difficulties of the design in the Embedded Database Management System. In order to improve the efficiency of the system, the implementation utilized various interface provided by VxWorks.Key Words: EDBMS; Module; Interface一、 EDBMS 总体结构嵌入式数据库管理系统,也称为 EDBMS 。它是由众多模块组成微型数据库管理系统。 依据各个模块主要功能、 功能间的依赖关系以及在 EDBMS 总体层次结构中所处的位置, 可 以从逻辑层面上将 EDBMS 划分为三个功能单元: EDBMS 管理单元、 EDBMS 操作执行单 元、EDBMS操作执行单元。EDBMS的总体模块划分如图 1所示。SMBDESMBDE监视;模块用户应用SQ接口API 接口表操作模块操作执行单元-数据 字 典管理 模 块属 性 列 操 作 模 块索 引 管 理 模 块表排序模块数据恢复/备份模块操作支事务管理模块模块并发控制模块模块存储管理模块网络通信模块持单元VxWorks操作系统图1 EDBMS总体模块设计一) EDBMS管理单元管理单元充当了传统数据库系统管理员的角色。具体分为以下功能模块:1、初始化模块:完成 EDBMS的初始化工作。依据用户的定制,创建各个功能模块的 对应任务;依据用户的参数配置,初始化公共数据结构,包括系统表、用户数据表等;通过与日志管理模块的交互,决定是否有必要进行数据库状态的恢复(事务回滚);如果是在分布式环境下,同时要求操作系统初始化通信设备, 并依据同步策略的设定, 初始化网络通信设 备驱动。2、异常处理模块:负责对 EDBMS所有异常处理策略的选择。依据各个模块所报告异 常情况的严重程度,可以将异常处理方式分为以下几种:1)系统级异常处理:此类异常属于特别严重的嵌入式数据库管理系统事件,诸如系统 内存区不足、核心模块创建失败、用户指定配置无法实现等,多发生在系统初始化的阶段。一旦此类异常被触发,就会导致EDBMS释放整个系统的资源,再次尝试重新启动或是放弃 启动。2)功能级异常处理:此类异常也大多发生在系统启动期间,如数据字典文件丢失、日志文件丢失,一些非核心模块的创建失败,会导致所要求的功能无法实现,在EDBMS运行联机日志期间, 由于用户数据文件的创建失败, 数据操作临时文件无法生成事务回滚失败、 文件写错误等也会导致功能级异常的发生, 默认处理方式是保持系统的正常运行, 但要求此 功能的各项操作均返回失败。3)事务级异常处理: 在 EDBMS 的运行期间, 要求对数据库的各种操作以事务来标识, 由于种种原因导致的事务的夭折都被提交至异常处理模块, 默认的处理方式是通知恢复模块 进行事务回滚。3、日志管理模块:负责 EDBMS 日志文件的增加,删除和归档等维护性操作。同时作 为系统的联机日志,在系统初启动时,要依据当前的状态决定是否需要进行恢复。调用 EDBMS 存储管理模块进行实时的 I/O 操作,记录本地日志文件,以维护系统的可靠性。如 果在 EDBMS 中并没有配置恢复功能,那么日志文件作为一个机制将被自动裁减;4、监视模块:监视系统中各个模块的运行情况,选择在适当的时机进行I/O 操作。如果配置有网络通信模块, 要求实时监控网络状况。 综合各方信息, 判定系统是否已经处于死 锁状态。 同时, 监视模块也作为一个窗口, 向用户提供当前嵌入式数据库管理系统的运行状 态、配置情况。如果功能要求的更为复杂,那么一些统计信息、报表等也可以由它提供。 二) EDBMS 操作执行单元操作执行单元对用户给出的各种数据库操作请求的响应。 相对于其他模块来说, 处于较 高层次,通过 API 或是 SQL 接口直接面向应用。主要是进行表和索引的操作。具体有以下 的模块:1、表操作模块:该模块负责接受针对用户数据表的增、删、改、查的基本功能。并且 通过查找数据字典、 系统表等的信息,验证该操作的可行性。 如果可行,则向下层的事务模 块提交请求。2、表排序模块:在用户表增加和删除记录后,都必须保证表中记录按照某个键值的有 序性, 以利于提高查询效率。对表中记录进行了修改操作之后,往往会引起重新排序。把排序操作作为一个独立的优先级较低的事务予以提交, 并由表排序模块控制。 作为用户数据操 作的一种附属动作, 之所以将它单独提出一个模块予以实现是考虑到其功能的独立性,以及对 I/O 的频繁操作。3、属性列操作模块: 用户针对元数据的操作由该模块负责处理, 如对字段的属性更改、 增加、删除。4、索引管理模块:对应每一个用户数据表,都可以创立多个索引文件,以利于实现快 速高效的数据查询。 该模块可以根据需求为用户数据文件创建索引, 并对所建立的索引文件进行维护。5、数据字典管理模块:用于维护整个数据库系统的核心数据结构一一数据字典。在数 据库字典中记录了数据库基本的必备信息以及用户表之间的联系。三) EDBMS 操作支持单元操作执行单元是真正体现数据库特性的关键之所在。 除了向操作执行单元提供服务, 保 证用户对数据库的访问, 更重要的责任在于维护整个嵌入式数据库系统的可靠性、数据一致性、安全性以及实现多个用户的并发访问。1)恢复 /备份模块:当事务进行回滚时,此模块按照进程日志的记录恢复数据到初始 状态,以保证数据库回复的一致状态。 备份的功能可以由监视机制按照指定原则适时进行或 是由应用程序调用执行,作为提高嵌入式数据库系统可靠性的方法之一。2)事务处理模块:用户的每一种操作,都以一个或多个事务的形式提交。事务是保持 数据库系统一致性的有效手段;3) 并发控制模块:并发控制模型可采用“锁机制”和“时间戳”,以保证多个用户对数 据的有效操作,保证数据的完整性;4)存储管理模块: 存储管理是实现数据库三种模式之间映射的基础。 借助于文件系统, 将物理存储上无组织、 无联系的二进制文本, 在内存中映射到相应的数据结构中, 以利于其 他操作模块的访问;5)网络通信模块:为实现分布式计算环境下,用户访问数据的透明性,由网络通信模 块对所访问的数据表进行定位, 并以临时文件的形式提交存储管理模块, 同时按照指定的策 略进行数据同步 2 。二、 EDBMS 对外接口EDBMS 作为一个有机整体,在嵌入式系统中充当应用软件中间件的角色,借助底层嵌 入式操作系统所提供的服务,向上层的数据库应用程序提供有效的、标准的数据操作接口。 所以,依据面向的对象不同, EDBMS 的对外接口可以分为以下两种:一)面向用户应用的接口用户应用程序对于数据库的操作不外乎两种:使用DML 对数据、索引的操作和使用2 所示。DDL 对元数据的操作 3。可以用一个简单的树型结构来描述这些操作,如图数据 索引1J数据索引文件文件*系统目系统表属性列录文件文件文件查找 索引增加 修改 删除 查找图2 EDBMS面向应用的接口EDBMS以API的形式提供了进行数据库操作的一般功能,包括用户数据表的创建和删除,索引表的创建和删除,向用户数据表增加记录,打开、关闭用户表等。其中,需要注意的就是排序操作, 它不但提供给用户,由应用程序决定对记录进行排序的时机,也可以作为一个内部接口提供给系统管理单元的监视模块使用,由监视模块控制在系统空闲时对已经发生更新的用户数据表进行排序。此外,在用户数据表更新到FLASH中时,必须保证其有序性,所以在调用存储功能的时候,也有可能调用排序操作,这也是将排序功能单独作为一个模块设计的原因。二)面向操作系统的接口EDBMS面向操作系统的接口,或者更确切的说,应该说是操作系统提供给EDBMS的接口可以分为两类:1宏定义EDBMS提供给外部使用的宏定义包括调用API函数所有可能的返回值和可配置的宏定义参数。如EDBMS可同时打开的用户数据表,输出缓冲区的大小,结果集缓冲区的大小等 等都是可配置的宏定义参数。当然,如果用户需要修改这些默认的定义,必须对EDBMS进行重新编译。根据具体的操作系统对这些宏定义参数的修改,可以获得更好的运行效率。若结果集缓冲区较大,那么查找在系统内存命中的概率就会上升,减小I/O操作的频率对提升EDBMS效率至关重要。以下列出了一些重要的宏定义。#ifdef INCLUDE_EDBMS_MODULE#define EDBMS_COLUMN_NAME_MAX_LEN/* 属性列名称的最大值 */#define EDBMS_USERNAME_MAX_LEN /* 用户名最大值 */ #define EDBMS_USER_PASSWORD_MAX_LEN /*密码最大值 */#define EDBMS_USRTBNAME_MAX_LEN /*用户表名字最大值 */#define EDBMS_USRTB_ID_MAX_V ALUE /* 用户表 ID 最大值 */ #define EDBMS_USRTB_PATH_LEN /* 用户表文件路径最大值 */ #define EDBMS_MAX_COLUMN_NUM/* 用户表中属性的最大个数 */#define EDBMS_MAX_REC_NUM /* 用户表中记录的最大个数 */ #define EDBMS_USRTB_MAX_FD /* 可同时打开最大的文件数 */ #define EDBMS_USRTB_MAX_INDEXFILE_NUM/* 一个用户表可建立的索引表最大个数 */#define EDBMS_DATA_DICTIONARY_MAX_ITEM/* 数据字典表项数的最大值 */#define EDBMS_TRANSACTION_IDLE_STA TUS /* 事务空闲状态 */#define EDBMS_TRANSACTION_COMMIT_STATUS/* 事务提交状态 */#define EDBMS_TRANSACTION_ABORT_SATATUS/* 事务夭折状态 */#define EDBMS_TRANSACTION_ROLL_STA TUS /* 事务回滚状态 */#define EDBMS_ERRORCODE_OPERATION_FAIL /* 操作失败 */#define EDBMS_ERRORCODE_BUFFER_OVERFLOW/* 数据缓冲区溢出 */#endif INCLUDE_EDBMS_MODULE2、APIEDBMS 基本功能的实现离不开嵌入式操作系统的有力支持。在设计的过程中,凡是 VxWorks 能够实现的功能都尽量交给操作系统完成,而不再提供其他的实现方式。这样做 的好处在于提高 EDBMS 的执行效率,同时简化了设计开发的过程,但是,同时也增加了 EDBMS 与 VxWorks 之间的耦合性,这样不利于 EDBMS 的移植。借鉴面向对象的思想, 对一些常用的系统操作进行封装, 在 EDBMS 的实现过程中, 调 用这些被封装过的函数,相当于在操作系统与 EDBMS 之间创建了一层“ EDBMS 虚拟机”, 那么将来移植到其他类型的操作系统上,只要重新编制一个“ EDBMS 虚拟机”,嵌入式数 据库管理系统就可以在新的环境中运行。EDBMS 在实现的过程中主要使用了 VxWorks 的进程调度和进程间通信机制、内存管 理、文件管理功能,那么对于操作系统功能的封装也主要集中在这些功能模块。 EDBMS 中 事务管理模块根据用户的请求创建相应的事务进程,在事务结束后释放相应的资源。三、 EDBMS 模块间接口在讨论 EDBMS 模块间的接口之前,必须清楚地了解模块之间的依赖关系。4.1 节中给出了 EDBMS 的总体设计以及模块划分, 图 3 主要展示各个模块之间的联系、 消息交互以及 功能调用 4 。各个功能模块之间的交互可以采用以下两种方式:一)借助消息队列发送控制消息消息队列的方式只能用于进程级模块之间的通信,因为只有进程级模块采用消息队列。 使用消息队列发送的大多数是控制消息。 如在系统初启时, 初始化任务创建各个进程级模块, 通过接收 INIT_ACK 同步各个模块的创建,并通知存储管理模块对系统和用户数据区进行 初始化; 异常处理模块也是通过消息队列接收各个模块的告警信息; 网络通信模块发送消息 到事务控制模块,通知有分布式事务请求等等。消息格式的定义如下:初始化模块数据区共享数据区图3 EDBMS各功能模块的联系typedef structUINT8 mType; /*消息类型标识 */UINT8mLenTag;/*长、短消息标识 */UINT8mSendlD; /*发送消息的进程号*/UINT8mRecvID; /*接受消息的进程号*/UINT16 mCode; /* 消息类型号*/UINT16 mCTRL; /* 消息控制字段 */UINT16 mParaDByte; /* 预留参数 */UINT8mParaByte1; /* 预留参数 */UINT8mParaByte2; /* 预留参数 */UINT32 mLen;/* 消息长度 */void* pktptr; /* 长消息数据区 */EDBMS_MESSAGE;二)共享数据EDBMS 中,共享的数据缓冲区在系统初启时,由初始化模块申请并配置至一个可用状 态,比如打开数据字典表、联机日志表、系统表、属性列表和一些指定的用户数据表等。这 些文件存储在嵌入式设备的永久存储器当中, 文件的组织格式也是各不相同。 但是, 一旦被 调度至 RAM 中,就必须是各个功能模块可以识别的有用数据。 数据定义就是用来刻画数据 库的框架,是 EDBMS 管理和存取数据的基本依据。在 EDBMS 中数据结构的定义非常多, 为了清晰起见,只对其中比较重要的数据结构进行介绍。数据字典、属性列结构、用户表控制结构以及用户表记录结构将在 5.1 节中详细介绍。 下面主要介绍一下结果集结构。结果集是 EDBMS 中一个重要的数据结构,对 EDBMS 的操作结果都是放在结果集中, 用户获取操作结果的记录数据信息都必须通过结果集。 若干结果集构成一个双向链表, 称为 结果集缓冲链表,具体定义如下。typedef structUINT32 EDBMS_Result_RecNO; /* 结果集中的记录序号 */BOOL EDBMS_Result_V alid; /* 该记录的有效标记 */UINT32 EDBMS_RecID; /* 该记录在用户表中的记录号 */EDBMS_RESULT_RECITEM;/* 结果集中每条记录的结构 */typedef struct _ EDBMS_RESULT_SET_UINT32 EDBMS_Result_ID; /* 结果集 ID */BOOL EDBMS_Result_Flag;UINT16 EDBMS_Result_BufferNum;/* 结果集在缓冲链表中的位置 */UINT32 EDBMS_Result_RecCount; /* 结果集中记录个数 */UINT32 EDBMS_Result_ValidCount; /* 结果集中有效记录个数 */CHAR *EDBMS_Result_SetFileName;/* 存放结果集所有记录的文件 */_ EDBMS_RESULT_SET_ *prie; /*指向前一个结果集*/_ EDBMS_RESULT_SET_ *next; /*指向下一个结果集*/EDBMS_RESULT_SET/* 结果集控制结构 */三)函数调用在 EDBMS 内部, 函数调用大部分发生在操作执行单元的各个非进程级模块。 比如说对 于用户表的操作模块往往会调用其他的四个模块, 因为对于用户表的操作可能需要其他数据 的支持,诸如数据字典、索引文件等。此外,事务管理模块接受到用户请求后,也会调用操 作支持单元的函数, 创建相应的事务进程、 子事务进程。 还有, 就是子事务在执行的过程中, 如果出现文件尚未打开的情况,会调用存储管理模块的全局函数,实现对用户文件的 I/O 。 由于篇幅的关系,这里不详细列出各个函数的原型。参考文献1 Michael O.Challenges in Embedded Database System Administration. Massachusetts, USA ,Cambridge: Harvard University,2002.2 宋茂强 . 通信软件设计基础 . 北京:北京邮电大学出版社 ,2001.3 王金刚,宫霄霖,杨锡劢.基于VxWorks的嵌入式实时系统设计.北京:清华大学出版社,2004.4 苗雪兰 , 刘瑞新 , 宋会群 . 数据库系统原理及应用教程 . 北京:机械工业出版社 ,2004.
展开阅读全文