目前国内农业气象信息处理系统大多采用文件方式或本地数据库进行数据管理, 无法满足网络环境下多用户的应用需求, 难于实现数据的共享, 少数采用远程数据库管理数据的应用系统也是采用传统的二层体系结构模式开发而成, 对数据的处理要么靠远程数据库完成, 要么在客户端完成, 存在网络流量大, 阻塞严重, 系统运行效率低, 数据分布处理能力差, 系统升级维护不便等缺陷, 而三层体系结构能较好地解决这些问题。三层体系结构以其特有的优势正成为开发C/S数据库应用系统新的发展方向。
1 三层体系结构所谓三层体系结构[1, 2]是针对单层和二层结构而言的, 单层结构数据库应用系统的应用程序和数据库共享同一个文件系统, 它们使用本地数据库或文件存取数据, 而在二层结构和三层结构的数据库应用系统中, 使用远程数据库存取数据, 数据库和应用程序位于彼此不依赖的系统 (层) 中, 三层结构的应用系统还在数据库与客户程序间增加了一个中间层———应用服务器。
1.1 三层体系结构与二层体系结构应用系统的对比由图 1可知, 在二层体系结构应用系统中, 客户程序直接向数据库服务器发出数据请求, 数据库服务器将客户请求的数据返回客户程序, 而数据的加工、分析、统计、显示、打印等工作均由客户程序负责完成, 客户程序非常“胖”, 而在三层体系结构应用系统中, 在客户程序和数据库服务器之间增加了一个中间层———应用服务器, 客户程序先向应用服务器发送客户请求, 再由应用服务器向数据库服务器请求数据, 数据库服务器将客户请求的数据返回给应用服务器, 由应用服务器负责数据的加工、整理、分析、统计等工作, 然后将处理后的结果返回给客户程序, 客户程序只负责数据的显示、打印等工作, 因此客户程序可以做得很“瘦”。
|
|
| 图 1. 二层与三层结构应用系统数据流向对比图 | |
1.2 三层体系结构的优势
目前比较普遍的做法是采用二层体系结构开发Client/Server模式的应用, 三层体系结构模式由于在客户 (Client) 和数据库服务器 (Server) 间增加了中间层 (应用服务器) 的开发, 给开发工作增加了不少的难度, 因此, 目前采用三层体系结构开发Client/Server模式的应用较少, 但三层体系结构比二层体系结构具有明显的性能优势, 具体表现在:在一个共享的中间层封装了常用的数据统计、分析、处理功能, 不同的客户程序可以共享同一个中间层, 而不必由每个客户程序单独实现相应的功能。
客户程序可以做得很“瘦”, 因为很多复杂的工作由应用服务器代劳了, 客户程序只需关注用户界面本身, 而“瘦”客户程序更容易发布、安装、配置和维护。
实现了分布式数据处理。把一个应用程序分布在几个机器上运行, 可以提高应用程序的性能。
有利于安全。可以把一些敏感的功能放在有严密防护措施的层上, 同时又不至于使用户界面变得复杂。
1.3 客户程序与应用服务器之间的通讯在三层体系结构的应用系统中, 客户程序、应用服务器和数据库服务器运行在不同的计算机系统, 跨越了机器边界, 实现了数据的分布式计算和处理。目前用于分布式处理的技术规范和标准有两种, 一种是使用最为广泛的部件对象模型 (COM) 和分布式部件对象模型 (DCOM), 另一种是新近推出的混成环境下的对象开发模型, 即CORBA开发模型。农业气象信息处理系统采用DCOM模型开发, 在此只介绍DCOM模型中客户程序与应用服务器之间的通讯。
分布式部件对象模型 (DCOM) 是为增强COM模型的分布功能而发展起来的, 就部件对象的开发而言, COM对象与DCOM对象之间没有本质的差异, 在此, 以介绍COM模型下客户与服务器之间的通讯为主, 并对DCOM模型下的不同之处加以说明。
COM本质上仍然是客户/服务器模式。COM服务器实际上是组件对象的容器, 而组件对象向COM客户提供服务。通常一个COM组件对象支持一个或多个接口, 而每个接口支持或实现若干个方法 (一个方法是完成某个特定任务的函数或过程), COM对象的服务功能是靠调用它支持的接口所含方法来实现的。
当一个客户请求某个COM对象的服务时, 通过向库程序传递对象的类标识码 (CLSID), 请求Windows从注册表中查找、定位、启动COM对象, 并将对象的接口指针交给客户, 客户用该指针调用对象接口的方法, COM对象执行该方法完成客户请求的服务[3, 4]。DCOM模型下的过程与此相似, 不同之处在于这一过程涉及两台计算机, 当客户调用一个远程对象的方法时, 必须解决跨进程 (跨机器) 的通讯 (参数传递) 问题, DCOM采用“引导”的方法来解决这个问题, 即通过“代理”对象和“接头”对象来实现[7]。
由前述可知:客户程序与应用服务器之间的通讯是通过应用服务器中所含COM对象提供的接口来实现的。如图 2所示, 用DELPHI编程语言开发的应用服务器提供两种类型的接口, 一种是远程数据模块的接口, 在客户端可通过连接构件的AppServer属性获得该接口, 通过该接口调用远程模块上的方法; 另一种是远程数据模块上COM构件提供的Iprovider接口, 该接口在客户端可通过TclientDataSet构件的Provider属性获得, 提供Iprovider接口的构件有两类, 一类构件显式地提供Iprovider接口, 它们是TdataSet-Provider构件和Tprovider构件, 另一类是基于BDE的数据集构件 (如T table、Tquery、Tstoreproc等构件), 它们通过其Provider属性间接地提供Iprovider接口。
|
|
| 图 2. 三层数据库应用程序的体系结构 | |
2 信息处理方法
气象信息处理系统结构如图 3:该系统集原始报文的接收解译、资料入库、库维护[5, 6]、气象要素时空分布图的绘制[7]及各种分析应用功能于一体, 每一功能项均体现了三层体系结构设计思想, 比较典型的表现在以下几个方面:
|
|
| 图 3. 系统体系结构框图 | |
① 原始报文的接收解译和资料的入库:客户程序通过FTP方式将原始报文从成都区域气象中心服务器下载到本地硬盘, 并上传应用服务器。由应用服务器负责报文的解译, 并将解译后获得的资料存入远程数据库。
② 库维护:客户程序提供操作界面, 供用户选择对哪个站点哪个时段的何种资料进行维护, 并提供编辑窗口供用户编辑记录。应用服务器一方面负责从远程数据库中提取用户所需的记录并返回给客户程序, 另一方面负责向远程数据库提交用户对记录所作的修改。
③ 阶段值的统计:客户端程序负责提供供用户选择资料类型和统计时段的操作界面, 并负责生成统计表格。应用服务器根据客户端提交的资料类型和时段信息, 从远程数据库的相应数据表中提取所需时段的记录, 并完成资料的统计, 最后将统计结果返回客户程序。
④ 干旱、高温、降水过程的统计:客户端程序负责提供供用户选择统计标准和统计时段的操作界面, 并负责生成统计报表。应用服务器根据客户端提交的时段信息, 从远程数据库的相应数据表中提取所需时段的记录, 并根据各种过程的统计标准完成资料的统计, 最后将统计结果返回客户程序。
3 应用及例举下面我们将以雨量要素的编辑修改和某时段内降水总量的统计为例介绍三层体系结构应用系统的开发方法。
3.1 数据表及表结构StationInfo———台站基本信息表:
|
|
应用服务器的关键部件是远程数据模块, Delphi 4支持三种类型的远程数据模块, 我们选择其中称为TremoteDataModule的类型进行开发, 该远程数据模块的类名被命名为AmifcsServer, 其线程模式和实例模式分别取“Apartment-threaded”和“Multiple instance”, 应用服务器取名为Sv。
3.3 连接构件的选取和配置为了与应用服务器进行通讯, 需要在客户程序的数据模块上放置连接构件并进行必要的配置, 不同的MIDAS连接构件使用不同的通讯协议, 其中TDCOMConnection连接构件使用DCOM通讯协议, 是一种最直接的连接方式, 它不需要专门的运行期软件支持, 不过Windows 95不支持DCOM, 除非安装了DCOM 95程序, 我们选用另一个称为TsocketConnection的连接构件, 它使用TCP/IP通讯协议, 它需要在应用服务器端运行一个专门的运行期软件Sckt srvc.exe, 该软件可在Delphi的相关目录下找到。
该构件需配置以下几个属性:
|
注:Address属性和Host属性是互斥的, 只需设置其中一个。
3.4 BDE数据集构件的设置和Iprovider接口的引出我们没有用TdataSetProvider构件或Tprovider构件来提供Iprovider接口, 而是在远程数据模块上放置一个TQuery构件由它提供Iprovider接口, 其相关属性设置如下:
|
注:Amifcs_Sql是SQL Server 7.0下的农气情报数据库 (NQQB_da ta.MDF) 的BDE别名, 由SQL Explorer或BDE管理程序定义。
引出Iprovider接口非常简单, 只需用鼠标右键单击AmifcsQuery构件, 在弹出的菜单中选择“Expo rt From AmifcsQuery in Data Module”命令即可。
3.5 雨量要素的编辑修改远程数据模块上的AmifcsQuery构件设置了两个参数Y和No, 只要客户程序向它传递参数值, 它便能从Rain数据表中提取指定台站 (No) 指定年份 (Y) 的雨量资料, 为此在客户端放置一个TclientDataSet构件, 并对其相关属性作如下设置:
|
至此, 客户与服务端的连接设置已告完成, 只需在客户程序中为ClientDataSet1的参数Y和No赋值, 并打开ClientDataSet1构件, 即可在客户端获得所需台站和年份的降水资料, 为此可在客户端放置一个TBitbtn按钮, 并为其编写如下的Click事件代码:
procedure TcountForm.BitBtn1Click (Sender:TObject);
begin
with clientdataset1 do
begin
close;
{为参数Y (年份) 赋值}
params.ParamByName (' Y').asinteger:=1999;
{为参数No (区站号后4位) 赋值}
params.ParamByName (' no').asinteger:=6294;
{打开构件以便获得所需数据}
open;
end;
end;
此时, 只要分别编译运行应用服务器和客户程序, 并点击Bitbtn1按钮, 客户端即可获得所需数据, 但用户还看不到数据, 这是因为客户程序没有数据显示功能的缘故, 为此, 客户端还应放置如下构件并作相应设置:
|
再次编译运行客户程序, 即可在DBGrid1构件中看到成都 (56294) 1999年的逐日降水资料, 并可对其中的数据进行编辑修改。在客户程序中改变参数Y和No的值, 即可编辑修改不同台站不同年份的降水资料。
3.6 某时段内降水总量的统计在远程数据模块上为此类库创建一个新的方法, 取名为CountData, 设置其返回类型为OleVariant, 并设置6个类型为Integer的参数Ystart、Mstart、Dstart、Yend、Mend、Dend, 分别代表统计时段起止年、月、日, 并为其编写如下程序代码, 以完成降水量的统计并返回统计结果:
function TAmifcsServer.CountData (Ystart, Mstart, Dstart, Yend, Mend, Dend:Integ er):OleVariant;
var
value:array[0..156] of single; {各站阶段降水量}
stations:smallint; {台站数}
begin
全省各站某时段降水量的统计并存入value[]数组中
{通过Result变量将统计结果返回客户}
Result:=VarArrayCreate ([1, stations], varOleStr);
fo r id:=1 to stations do
Result[id]:=formatfloat (' 0.0', value[id]);
end;
将服务端软件编译存贮后, 在客户端放置另一个按钮Bitbtn2, 并为其编写如下的Click事件代码:
procedure TcountForm.BitBtn2Click (Sender:TObject);
begin
{调用远程模块上的CountData方法}
getvalue:=datamodle.Remo teServer.AppServer.CountData (1999, 7, 1, 1999, 8, 31);
end;
此时编译运行客户程序并点击Bitbtn2按钮即可统计出全省各个台站1999年7月1日至1999年8月31日期间的降水总量, 改变起止时段参数即可统计出不同时段的降水总量。当然还应该在客户程序上增加报表页, 以显示和打印统计结果, 限于篇幅不再赘述。
4 三层结构应用系统的开发方法根据上述实例, 可以归纳出用DELPHI 4进行三层结构应用系统开发的一般方法及开发过程中应注意的问题, 现分述如下。
4.1 应用服务器的开发第1步根据要创建的应用服务器的类型, 选择一种远程数据模块, 并为其选取适当的线程和实例模式。如果要创建COM自动化服务器, 需要选用Remo te Data Module数据模块, 如果要创建DLL类型的MTS服务器, 需要选用MTS Data Module数据模块, 如果要创建CORBA类型的服务器, 需要选用CORBA Data Module数据模块。
第2步在数据模块中加入适当的Table、Query、Sto reProc等基于BDE的数据集构件, 并设置有关属性以实现到数据库服务器的连接。
第3步, 如果使用TdataSetProvider或Tprovide数据供应构件显式地提供Iprovider接口, 则必须为每个将被客户访问的数据集提供一个数据供应构件, 并将每个数据供应构件的DataSet属性设置成与之相连的数据集的名字。
第4步输出Iprovider接口, 以便在类型库中注册, 其方法是选中数据模块中的数据供应构件或基于BDE的数据集构件, 单击右键选择弹出式菜单中的Export From〈name〉in Data Module项即可。
第5步向远程数据模块接口添加新的属性和方法, 并编写代码以实现其功能。这一步是应用服务器开发的关键, 应用服务器向客户提供的一切服务功能都在这里实现。
第6步保存、编译、注册或安装服务器。COM自动化服务器的注册非常简单, 只需将应用服务器运行一次即可。MTS服务器和CORBA服务器的安装注册要复杂一些, 需要运行相应的安装注册软件。
第7步安装有关的运行期软件, 即安装有关的支撑软件。如果采用DCOM作为通讯协议, 不需要安装支撑软件, 如果采用TCP/IP通讯协议, 则需要安装ScktSrvr.exe运行期软件。
4.2 客户程序的开发第1步在项目文件中增加一个数据模块。
第2步根据采用的通讯协议在数据模块中加入一个连接构件, 使用DCOM通讯协议时选择TDCOMCo nnection连接构件, 使用TCP/IP通讯协议时选择TsocketConnection连接构件。
第3步设置连接构件的有关属性以定位应用服务器所在的计算机并标识应用服务器本身。定位应用服务器所在的计算机是通过设置ComputerName属性 (DCOM协议时), Address或Host属性 (TCP/ IP协议时) 实现的, 标识应用服务器是通过设置ServerName属性实现的。
第4步根据需要在数据模块中添加适量的TclientDataSet构件, 并且将它们的RemoteServer属性设置为连接构件名, 将ProviderName属性设置成给它提供数据的远程数据模块上的数据供应构件名或基于BDE的数据集构件名。
第5步在项目中增加Form, 并根据系统功能在Form中放置必要的控件和按钮, 编写代码, 利用连接构件的AppServer属性调用远程数据模块接口中的方法, 并向该方法传递相应的参数, 从而实现系统功能。
第6步保存、编译、运行客户程序。
4.3 三层结构应用系统开发的原则与技巧要创建一个三层结构的C/S应用系统, 首先要创建应用服务器, 然后注册或安装应用服务器, 只有应用服务器已注册并且正在运行的情况下, 才能创建客户程序。
在客户程序的设计期如果要与应用服务器连接, 当客户程序与应用服务器不在同一个系统中时, 必须在客户计算机上注册或安装应用服务器才能实现连接。
无论是在服务器端还是在客户端都需要有DBCLIENT.DLL动态链接库的支持, 它用于数据包的管理, 为保证它的存在, 最好将它连同应用程序一起分发。
如果采用的通讯协议不是DCOM协议, 必须在应用服务器端安装并运行相应的支撑软件才能实现连接。
尽量不要把Tdatabase构件放到远程数据模块上, 因为这可能引起名称冲突。如果实在要用Tdatabase构件来连接SQL数据库, 应把它放到另一个数据模块上, 然后引用这个数据模块的单元文件。
一个真正的三层结构应用系统其客户程序必须做到与远程数据库相隔离, 即客户程序在任何时候都不直接读写远程数据库, 因此不能把基于BDE的数据集构件放到客户程序的数据模块中, 客户端的数据集只能是TclientDataSet构件。
当客户程序从应用服务器检索到数据后, 就在内存中建立这些数据的副本, 用户对数据所作的编辑修改 (包括更新、删除、插入等) 只是对数据副本的修改, 为了完成对数据库中数据的修改必须调用TclientDataSet构件的ApplyUpdates函数, 由于同一原因, 内存中的数据可能不是数据库中的实际数据 (库中数据已可能被其他用户所修改), 为了使内存中的数据是当前最新数据, 应及时调用TclientDataSet构件的Ref resh方法。
为了提高二层结构应用系统的性能, 开发者必须注重远程数据库服务功能的开发, 但在三层结构应用系统的开发过程中, 往往容易造成片面追求应用服务器功能的开发, 而忽略了对远程数据库功能的开发, 其实像数据编辑、修改、插入、删除等涉及对数据库写操作的功能还是编写数据库存贮过程来实现才能达到最佳性能。
5 结束语三层体系结构是今后开发Client/Server模式的数据库应用程序的发展方向之一, 可以预计, 在不久的将来, 将涌现出大量基于三层体系结构的数据库应用系统, 本文结合农业气象信息处理系统的开发, 简要介绍了基于COM技术的三层体系结构应用系统的开发方法, 以期该技术在气象系统得到普及和推广。本系统现已投入业务使用, 并在四川省民政厅、四川省人民政府救灾办公室、四川省农业厅、四川省农田水利管理局、重庆市气象局、乐山市气象局、宜宾市气象局、温江农业气象试验观测站等单位获得推广和应用, 取得了良好的业务和社会效益, 为我省的农业生产和防灾救灾工作作出了贡献。
| [1] | 徐新华.Delphi 4核心编程技术. 北京:希望电脑公司,1998. |
| [2] | 刘韬.Delphi 4.0数据库编程.北京:人民邮电出版社,1999. |
| [3] | 徐新华.Delphi 5高级编程--COM、CORBA与Internet编程.北京:人民邮电出版社,2000. |
| [4] | 龚健雅.当代GIS的若干理论与技术.武汉:武汉测绘科技大学出版社,1999. |
| [5] | Swan T. Delphi 4实用大全.北京:中国水利水电出版社,1999. |
| [6] | 张威.Delphi 4.0编程与技巧. 北京:科学出版社,1999. |
| [7] | 孙家广,杨长贵.计算机图形学.北京:清华大学出版社,1998. |
2003, 14 (1): 109-118

