书城工业技术制造业信息化工程原理和案例
19099100000045

第45章 企业信息系统的支撑环境(3)

(1)DBMS的基本功能

DBMS为数据库的建立、使用、维护进行统一的管理和控制,其基本功能是:

a.数据库定义和存取

DBMS最基本的功能是正确、安全、可靠地执行数据库语言的操作语句。一般,它要提供数据定义语言来定义数据模式,其结果保存在数据字典中,用来刻画数据库的框架,是DBMS存取和管理数据的基本依据。DBMS通过数据操纵语言(DML)和数据查询语言(DQL)来实现对数据库的增、删、改、查等基本操作。

b.数据库运行管理

数据库运行管理是DBMS运行的核心,包括并发控制、存取控制(安全性检查)、恢复机制、完整性约束条件的检查和执行,以及数据库内部的维护(例如索引、数据字典的自动维护)等。所有数据库的操作都要在这些控制程序的统一管理下运行,以保证事务处理的正确性。

c.数据的组织、存储和管理

DBMS要分门别类地组织、存储和管理各类数据,包括数据字典、用户数据、存取路径等。要确定以何种文件结构和存取方式在存储级上组织这些数据,如何实现数据之间的联系。数据组织和存储的基本目标是提高存取空间利用率及选择合适的存取方法,以提高存取效率。

d.数据库的建立和维护

数据库的建立和维护包括数据库的初始建立、数据的转换、数据库的转储及恢复、数据库的重组织及重构造,以及性能监测分析等功能。

e.其他功能

其他功能包括DBMS与网络中其他软件系统的通信功能,以及一个DBMS与另一个DBMS或文件系统的数据转换功能等。

应该指出,DBMS本身并不能全部解决数据管理的问题,DBMS设计的目标也不是要解决所有的问题。但是,DBMS提供了数据管理的大量基本功能。目前的商用数据库系统,为了提高数据库应用的开发效率,往往为用户提供了一个良好的第四代应用开发环境,它是DBMS功能的延伸和扩充。

(2)DBMS的层次结构

最上层是应用层,位于DBMS的核心之外,包括各种各样的应用程序。它是DBMS与应用程序的界面层。

第2层是语言翻译处理层,其功能是对数据库语言的各种语句进行语法分析、视图转换、授权检查、完整性检查、查询优化等。

第3层是数据存取层,其功能是将上层的集合操作转化为单记录操作,例如元组的增、删、改、查、封锁等基本操作,完成数据记录的存取、存取路径维护、并发控制、事务管理等工作。

第4层是数据存储层,它对数据页和系统缓冲区执行文件的逻辑打开、关闭、读写页、缓冲读写、页面淘汰等操作,完成缓冲区管理、内外存交换以及外存管理等功能。

操作系统是DBMS的基础,它提供的存取原语和基本的存取方法通常作为与DBMS存储层的接口,执行物理文件的读写操作,保证DBMS对数据逻辑上的读写真实地映射到物理文件上。

(3)进程的安排

DBMS是作为操作系统的用户进程而运行的。现代DBMS进程的划分主要着眼于结构的合理性和性能的提高。目前,多数DBMS把主要功能组成一个DBMS的核心进程,它是执行事务的主要进程,应用程序在运行时需要创建相应的应用进程,每个应用进程访问数据库时又需要创建一个DBMS的核心进程。DBMS的核心进程在完成应用进程所委托的访问数据库的任务后即撤消。多个DBMS核心进程在操作系统的调度下,并发地运行,实现多事务的并发执行。这种方法实现起来很直接,但有以下缺点:

a.进程的创建、撤消、通信和切换的开销较大;

b.不适合有大量并发事务的联机事务处理系统;

c.不利于事务共享内存空间。

为了克服这些缺点,不少DBMS产品采用多线程单进程结构。线程是现代操作系统中引进的概念。在这类操作系统中,以线程作为程序并发执行的单位,分享CPU时间。一个进程中可以创建多个可切换的线程,这些线程至少有一个处于就绪状态,进程才能处于就绪状态。进程运行时,其中必有一个线程在运行。创建线程所需的资源,特别是内存资源,要比创建一个进程少得多,线程的切换开销和线程间通信开销也比进程小。在单进程多线程的DBMS中,系统只创建一个DBMS进程。该进程中有常驻的公共服务线程和根据用户要求创建的非常驻用户线程。

(4)查询的处理和优化

这里的查询(query)泛指用户对数据库的访问要求,不但包括数据查询,也包括修改数据和定义新数据等要求。用户在查询时一般只提出查询的要求而不涉及具体的查询过程,因此,查询过程的拟定和优化需要由DBMS来完成。查询优化应该是寻找最优的执行策略。由于可能的执行策略很多,用“穷举法”寻优是不现实的。在实践中,常常在查询优化取得的效率与它本身的开销之间寻找平衡点。

查询优化有多种途径。一种是对查询语言进行某种变换,例如改变查询执行的次序,使查询语言执行起来更有效。这种查询方法仅涉及查询语言本身,而不涉及查询路径,故称为独立于存取路径的优化,或称为代数优化。最常用的变换原则是尽可能减少查询过程中间结果的大小,例如,在变换查询时总是让选择和投影等一元操作先做,再做连接等二元操作,在连接时也是先做小关系之间的连接,再做大关系之间的连接。

查询优化的另一途径是根据系统所提供的存取路径,选择合理的存取策略,例如,选用顺序搜索、索引等存取路径进行查询,这称为依赖于存取路径的优化,或称为物理优化。还有一些查询优化,除根据一些基本规则外还对可供选择的执行策略进行代价估算,从中选用代价最小的执行策略,称为代价估算优化。查询的执行代价是指执行查询的时间开销,包括访问辅助存储器的代价、计算代价、通信代价。

在做执行策略的选择时,以代价的大小作为其选择依据。DBMS往往综合运用上述优化方法,以取得最佳的效果。

7.3组件对象模型

随着软件应用范围越来越广泛,对软件的集成要求也越来越多和越来越高。

尽管我们可以通过接口技术、互连技术来解决不同软件的集成问题,但这不是最佳的集成方案。近年来,组件化程序设计的思想倍受人们的关注。按照这种思想,复杂的应用程序被设计成一些小型、功能单一的组件模块,这些组件模块可以运行在同一台机器上,也可以运行在不同的机器上,甚至可以运行在跨国的两台机器上。

理论上,每台机器的运行环境可以不同,甚至可以是不同的操作系统。实现这种设想的关键是组件程序的设计和组件的接口必须遵守统一的规范。组件对象模型(COM)就是Microsoft提出的一种规范。

7.3.1组件、对象和接口

过去的软件工程往往为应用程序越来越复杂而感到困惑。一个统一而庞大的应用程序面临开发困难、版本升级困难、与其他应用程序集成困难等问题。组件化程序设计的思想是把一个庞大的应用程序分成多个模块(即组件),每个模块单独开发、单独编译,甚至单独调试和测试,然后再组合成复杂的应用。当系统的外界软硬件环境发生变化或者用户需求发生变化时,并不需要对所有组件进行修改,而只需要对受影响的组件进行修改,然后重新组合得到新的升级软件。

假定版本升级要求把组件1变成组件a,组件4变成组件d,而组件2和组件3不变。于是,在保持原有接口的基础上,很容易完成版本升级。如果新的组件是为了适应软件环境而发生的改变,那么新版本就能适应新的软件环境。

在看到组件化程序设计优点的同时,也要看到这种新思想带来的新课题。对于一个十分复杂的应用,划分组件并不是很容易的事情,需要考虑一系列因素,例如模块的独立性、系统的应用逻辑和业务要求等,这引出了一门新的课程:组件化程序设计技术。它不同于传统的结构化程序设计技术,也不同于90年代盛行的面向对象的程序设计技术。可以说,组件化程序设计技术位于这两者之上,它更注重应用系统的全局和系统的集成;但是,具体到设计某个组件时,仍然以结构化程序设计和面向对象的程序设计技术作为基础。

实际上,组件之间的接口是构造组件软件的关键,它提供了组件之间通信的基础。因此,软件组件应遵循统一的标准,在同一软件中的组件必须使用同样的接口标准才能保证组件之间进行正常通信。至于采用什么标准,则取决于系统设计者的选择。如果设计软件时不考虑与其他软件的通信,可以采用自定义的接口标准;否则,应该使用一些公用的标准。

COM就是这样一种供大家使用的组件标准。COM不仅提供了组件之间的接口标准,还引入了面向对象的思想。COM对象以接口方式提供服务,这种接口称为COM接口。

在Windows系统平台上,一个COM组件或者是一个动态连接库(DLL)文件,或者是一个.exe文件。一个组件程序可以包含多个COM对象,并且每个COM对象可以实现多个接口。当另外的组件或者普通程序(即组件的客户程序)调用组件功能时,它首先创建一个COM对象或者通过其他途径获得COM对象,然后通过该对象所实现的COM接口调用它所提供的服务。当所有的服务结束后,如果客户程序不再需要该COM对象,那么它应该释放对象所占有的资源,包括对象自身。

7.3.2组件对象模型的结构

(1)对象和接口

COM是面向对象的软件模型。COM对象与C++中的对象类似,也认为对象是某个类(class)的一个实例;而类则是一组相关的数据和操作的集合。使用对象的应用(或另一个对象)称为客户,有时也称为对象的用户。接口是一组逻辑上相关的函数集合,其函数称为接口成员函数。对象通过接口成员函数为客户提供各种形式的服务。

在COM模型中,对象本身对于客户来说是不可见的,客户请求服务时,只能通过接口进行。一般说来,接口是不变的,只要客户期望的接口在组件对象中还存在,就可继续使用该接口所提供的服务。对象可以支持多个接口,因此对组件对象的升级可通过增加接口的办法来实现,这样得到的新接口不影响老接口的使用。

对象和接口都可以通过一个128位的全局惟一标识符(GUID)来标识,对象的GUID称为类标识符(CLSID),用CLSID标识对象可以保证在全球范围内的惟一性。

只要系统中含有这类COM对象的信息,并包括COM对象所在的模块文件.dll或.exe,以及COM对象的入口点,客户程序就可以由CLSID来创建COM对象,从而得到一个指向对象某个接口的指针。因为COM对象至少实现一个接口,所以客户就可以调用该接口所提供的所有服务。根据COM规范,一个COM对象如果实现了多个接口,则可以从某个接口得到该对象的任意其他接口,所以客户一旦得到一个接口指针,就可以得到所有接口提供的服务。从这个过程也可以看出,客户与COM对象只通过接口打交道,对象对于客户来说只是一组接口。

(2)C/S模式

从第5.3节已经知道C/S(客户/服务器)模式是一种在分布环境中的计算模式。对象与客户之间的相互作用就是建立在这种计算模式基础上的。比一般的C/S计算模式更进一步的是,对象和客户可以相互提供服务。一个对象既是服务也可以是客户,COM规范要求有效地处理这样的复杂情况。

COM虽然以C/S模式为基础,但它可以非常灵活地使用C/S模式。

(3)COM库

COM本身除了规范之外,也有实现部分,其中包括一些核心的系统级代码。

正是这部分核心代码才使对象与客户之间可以通过接口在二进制代码级进行交互。在Windows环境下,这些库以.dll文件的形式存在,其中包括以下内容:

a.提供少量的API函数,实现客户和服务器端COM应用的创建过程。在客户端主要是一些创建函数,在服务器端则提供一些对对象的访问支持。

b.COM通过注册表查找本地服务器的.exe程序,以及程序名与CLSID的转换等。

c.提供一种标准的内存控制方法,在应用控制进程中分配内存。

COM库一般不在应用程序层上实现,而在操作系统层上实现,因此,一个操作系统只有一个COM库实现。Microsoft在Windows NT、Windows 95/98/2000和Apple Macintosh分别实现了COM库。而且,COM库的实现必须依赖于具体的系统平台,尤其是系统底层的一些标准。COM库可以保证所有组件按统一的方式进行交互操作,而且使我们在编写COM应用时可以不必为通信编写大量的基础代码。可以直接利用COM库提供的API编程,从而大大加快软件开发进度。此外,还可以享受COM提供的其他特性,例如远程组件即分布式COM(DCOM),支持编程人员不需编写任何网络或远程过程调用(RPC)的代码而实现网络上程序之间的通信。