基于Delphi的三层数据库系统的实现方法

1  引言

当前的数据库应用系统中,按其结构划分为两类,一类是两层结构的数据库应系统,另一类是多层结构的数据库应用系统。

两层结构的数据库应用系统包括客户/服务器(C/S)模式和浏览器/服务器(B/S)模式,它的特点是数据和程序分离,数据库服务器端管理数据,客户机或浏览器显示、访问和更新数据,因此可以分别进行开发和维护,同时也降低了数据库服务器的工作量,减小了网络的流量,具有较强的安全性,但当客户端程序或浏览器较多时,服务器的性能会明显下降,而且应用逻辑安装在每个客户机上,如果系统要升级,就只能对客户机逐一进行,如果客户机分布在不同的地点,维护和升级任务将非常繁重。为了解决两层结构应用系统的不足,人们提出了多层数据库应用系统的结构模式,具有代表性的是三层结构。

 

三层系统的体系结构

所谓三层结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。在这种体系结构中,客户机只存放表示层软件,后台是数据库,业务逻辑包括事务处理、监控、信息排队、Web服务等采用专门的中间件服务器,大大减少了与数据库服务器连接的次数。通常情况下客户端通过COM/DCOM通讯与中间层建立连接,再经由中间层与数据库进行交互,客户端与数据库隔离,提高了整个系统的可靠性。在三层系统体系中,系统资源被统一管理和使用,用户可以通过网格门户(portal)透明地使用整个网络资源。 它的体系结构如图1所示。

三层结构功能如下:

表示层:提供简洁的人机交互界面,负责数据显示和客户端的数据处理,由客户机实现;

功能层:实现业务逻辑,即实现客户与数据库对话,同时,在这一层中,还应实现分布式管理、负载均衡、安全隔离等;它是一个远程模块,由应用服务器来实现;

数据层:负责数据管理,提供数据的存储服务,由数据库服务器来实现。

三层结构的主要特点:(1)安全性。中间层隔离了客户直接对数据服务器的访问,保护了数据库的安全。(2)稳定性。三层分布式体系提供了更可靠的稳定性:中间层缓冲Client与数据库的实际连接,使数据库的实际连接数量远小于Client应用数量。当然,连接数越少,数据库系统就越稳定。(3)易维护。由于业务逻辑在中间服务器,当业务规则变化后,客户端程序基本不做改动。(4)快速响应。通过负载均衡以及中间层缓存数据能力,可以提高对客户端的响应速度。(5)系统扩展灵活。基于三层分布体系,当业务增大时,可以在中间层部署更多的应用服务器,提高对客户端的响应,而所有变化对客户端透明。

 

 

三层系统的连接技术

3.1 前端连接技术(DataSnap)

在三层数据库应用系统中,客户端与应用服务器端常处于不同的物理区域,它们之间的数据传送成了影响系统运行效率最关键的技术。在Delphi中要建立与应用服务器的连接,客户程序必须使用一个或几个DataSnap连接组件,以及ClientDataSet等组件。首先DataSetProvider组件把读取的DataSet数据源压缩并切割成一段一段的数据包(Data Packet),通过各种传输协议如DCOM、TCP/IP、HTTP协议传给前端,前端的DataSnap连接组件会把接受到的数据包再还原成DataSet传给ClientDataSet组件,Data Control组件就可以将ClientDataSet作为数据源对它进行操作。

DataSnap技术是Delphi开发多层数据库应用系统的核心技术,它不但提供了基于DCOM、TCP/IP、HTTP三种传输协议的数据传送方式,还通过SimpleObjectBroker组件使系统轻易具备容错能力和负载平衡能力,使得Delphi开发的多层应用系统不但结构简洁、执行效率高、应用范围广,而且安全稳定,而且现在DataSnap还能够同时在Windows和Linux上执行。

3.2 应用服务器与数据库的连接ADO

ADO是Microsoft存取通用数据源的标准引擎,它通过封装OLE-DB来存取各种不同的数据,OLE-DB定义了统一的COM接口作为存取各类异质数据源的标准,藉由OLE-DB,程序员就可以使用一致的方式来存取各种数据,但OLE-DB太底层化,在使用上非常复杂,而ADO组件以COM技术封装OLE-DB为ADO对象,大量简化了程序员开发数据存取的工作,同时许多厂商也推出了ADO驱动程序,使得ADO应用日趋广泛。

实现方法

本例使用DCOM协议,系统模型如图2所示。

应用服务器是一个远程数据模块,它是一个COM程序,它通过ADO与SQL语句和数据库服务器连接。它负责从数据库服务器存取数据并通过DataSetProvider组件将数据分割成数据包,然后通过DCOM协议传递到网络上的客户端。客户端的组件负责还原数据,这项工作由DCOMConnection来完成。ClientDataSet组件是客户端数据集组件,它负责接收DCOMConnection组件还原过来的数据,并把数据传递给客户端数据处理组件,客户端数据处理和显示组件主要有ADOQuery、ADOTable、DataSource、DBGrid、DBEdit、DBComboBox等等,反过来,ClientDataSet组件负责收集客户端处理的数据,并把处理后的数据提交DCOMConnection组件,该组件通过DCOM协议和应用服务器正确地将数据写入数据库DB。

 

 

以显示学生数据库中学生基本信息表为例,具体地用Delphi语言实现步骤如下。

4.1  创建数据库

在E盘建立文件夹E:\学生课程管理,在该文件夹中创建Access数据库Student.mdb,包含表jbqk(基本情况)、course(课程)、teacher(教师)、sle_course(选课),jbqk表中设置主键为number(学号),以备查询之用。建立的表如图3所示。

 

 

图3  学生基本情况表jbqk

4.2  建立应用服务器程序

(1)建立一个应用程序,在窗体上添加ADOConnection1、ADOTable1、DataSource、DBGrid1四个组件,设置这四个组件的属性。

ADOConnection1的ConnectionString属性设置为Student.mdb,LoginPrompt属性设置为false,ADOTable1的Connection属性设置为ADOConnection1,TableName属性设置为jbqk(在下拉列表框中可以找到),Active属性设置为true。保存所有文件,项目文件名为AppServer,单元文件名为Server1。

(2)新建一个远程数据模块(Remote Data Module),设置类名为rdstu,在它的Uses子句中添加Server1,这样rdstu模块就可以访问Server1里面的组件了。在模块中添加组件DataSetProvider,设置它的DataSet属性为Form1.Table1,这样可以将本地数据读到DCOM服务器上,并由DataSetProvider组件提供给客户端。保存单元文件,命名为Server2。

运行程序后,系统自动在服务器注册程序,当有客户端程序运行时,系统会自动启动服务器程序。

4.3 建立客户端程序

为了方便描述,这里把客户端程序和服务器程序放在同一台电脑上。实际应用中通常把客户端程序与服务器程序放置在不同的电脑上。

新建一个应用程序,在窗体上添加DCOMConnection1、ClientDataSet1、DataSource1、DBGrid1、DBNavigator1等组件。

设置DCOMConnection1的ComputerName属性为服务器所在的计算机名,这样程序可以在网络上寻找服务器,如果本服务器已在本机注册,则不设置ComputerName属性;设置它的ServerName属性为AppServer.rdstu;设置它的Connected属性为True,此时激活服务器程序。

设置ClientDataSet1的RemoteServer属性为DCOMConnection1;ProviderName属性为DataSetProvider1。这样ClientDataSet1就可以通过DCOMConnection1从DataSetProvider1组件读取数据了。

DataSource1的DataDet属性设置为ClientDataSet1。

DBGrid1和DBNavigator1的DataSource属性设置为DataSource1。

结论

和两层C/S结构相比,三层C/S结构具有更灵活的硬件系统构成,对于各个层可以选择与其处理负荷和处理特性相适应的硬件。合理地分割三层结构并使其独立,可以使系统的结构变得简单清晰,提高了程序的可维护性。三层C/S结构中,应用的各层可以并行开发,各层也可以选择各自最适合的开发语言,有利于变更和维护应用技术规范。按层分割功能使各个程序的处理逻辑变得十分简单。在Delphi中主要通过DataSnap等技术来实现。随着基于Web的瘦客户机结构的发展,基于多层分布体系的应用将会越来越广泛。

参考文献

[1] 李维.Delphi 5.x ADO/MTS/COM+高级程序设计篇[M].北京:机械工业出版社,2000.

[2] 李维.Delphi 7高效数据库程序设计[M].北京:机械工业出版社,2003.

[3] 何鹏飞.Delphi 7程序设计教程[M].北京:清华大学出版社,2003.

[4] 张增强,刘成.Delphi 7数据库开发完全手册[M].北京:清华大学出版社,2003.

posted on 2019-03-18 17:56  癫狂编程  阅读(934)  评论(0编辑  收藏  举报

导航

好的代码像粥一样,都是用时间熬出来的