您的位置:首页 > 其它

基于PB环境下分布式应用系统的开发

2009-05-06 09:59 246 查看
1 引言
在编写C /S结构的数据库应用系统时,遇到
此类问题,如果客户数量很多,数据量大的情况下,
服务器的负载就会很重,而且重复性工作很多,因
为很多的查询可能完全相同而服务器却需要一一
进行查询;同时查询算法存储于客户端,这可能不
适合一些商业环境,因为算法本身可能是需要保密
的。如果能够在传统的服务器和客户机之间再加
一个服务器用于存储查询算法和临时查询结果,则
以上问题均得到了解决。
2 多层分布式应用系统的原理
2. 1 两层C /S结构的局限性
传统两层C /S模式的主要缺点是:
①由于客户端包含了用户界面和大量的业务
逻辑,因此显得过于庞大,为了支持复杂计算,必须
提高客户机性能,加大了应用投资。②业务逻辑分
布在每个客户机上,缺乏良好的可维护性和可扩展
性,对于每次业务处理的更改需要更新所有的客户
机应用;公共的业务处理逻辑不能形成共享,造成
重复开发。③由于客户端直接连接数据库,因此某
些用户在获得了一定的权限后可以绕过客户端应
用而直接操作数据库,对数据的安全构成了威胁。
为了克服这些不足之处,人们利用DBMS的存
储过程将某些业务逻辑处理移到服务器端。但由
于各个DBMS互不兼容,有的甚至不提供存储过
程,因此业务处理只能在特定的DBMS中执行,缺
乏互操作性、开放性,与其他应用集成困难,这种两
层半的模式效果是很有限的。
2. 2 多层分布式应用模型及优点
多层C /S应用结构的特点是在传统的两层C /
S应用结构中的客户端与服务器之间插入一层或
几层中间件或称为应用服务器,由中间件处理应用
系统的业务逻辑。客户端程序变得更小、更快。中
间件可以有多个并且可以安装在不同的计算机上,
将处理工作分散开来,改善性能,形成多层分布式
计算。多层分布式应用具有如下优点:
①把业务逻辑封装在组件中,并且部署在应用
服务器上以供多个客户端调用,这种组件式开发提
高了应用系统的可重用性和可扩展性。某些通用
处理功能的组件可以复用到其他的应用系统中,提
高了开发效率。②分布式数据处理。③“瘦”的客
户端。客户端应用程序可以写得很小,而把关键业
务处理交给中间层, ④增强安全性。可以通过使用
不同的访问约束,来分层隔离敏感的算法和数据。
另外,组件可共享数据库的连接,降低了数据
库服务器的负担;组件功能独立,有利于开发团队
的分工与合作。
3 PB环境下分布式应用程序开发
PB环境下分布式系统工作原理图如图1:
1 PB下分布式系统原理图




在PB 环境下要实现分布式的编程,首先在
DTS端,需要用到两个对象,一个TransPort对象和

一个不可视的用户对象(ClassàCustom, Nonvisib2
leObject,以下简称NVO) ,其中TransPort对象用于
响应客户端的连接请求, NVO对象用于和客户端
进行实际的数据传输。在客户端也需要用到两个
对象,分别是Connection对象和代理对象(NVO -
Proxy) ,其中Connection对象用于建立到DTS的连
接,NVO - Proxy实际上是与NVO 一一对应的,它
只是NVO的一个代理,在客户端通过此代理对象来
调用NVO的函数来实现相关功能。以下是TransPort
对象和Connection对象的常用属性及方法:
3. 1 TransPort对象
属性:
Driver:可选的值有四个, 分别是WinSock、
NamedPipes、OpenClientServer和Local, 由于W in2
sock的通用性,一般情况下都选择Winsock。Ap2
p lication:对于W insock而言指的是端口号,用户可
以任意指定,但必须大于4096。
方法:
L isten ( ) :其调用方法是transport. L isten ( ) ,即
开始监听,如果调用成功则返回0。
StopListening( ) :其调用方法是transport. StopLis2
tening( ) ,即结束监听,如果调用成功则返回0。
3. 2 Connection对象
属性:
Driver:与Transport对象相同
App lication:与Transport对象相同,但要注意
两者必须一致。
Location: DTS的IP地址
方法:
ConnectToServer ( ) :其调用方法是connection.
ConnectToServer ( ) ,即连接DTS,如果调用成功则
返回0,显然在调用该函数之前, DTS必须处于监
听状态。
DisconnectServer ( ) :其调用方法是connection.
DisconnectServer ( ) ,即断开与DTS的连接。
Create Instance ( ) : 其调用方法是connection.
Create Instance ( variable) ,即建立一个NVO的代理
以便调用NVO的相关函数。注意在调用该函数之
前,必须保证客户端已经与DTS建立了连接。对
于NVO和NVO - Proxy对象,在DTS中建好NVO
后,为了在客户端设置其代理,可以先在DTS中设
置本地代理,然后将此代理输出到客户端。具体设
置方法如下:在PB 的用户对象画板中,在用户对
象上点击鼠标右健,选择“Set Proxy Name”,输入代
理对象的名称并存盘,打开PB 的L ibrary画板,找
到刚才保存的代理对象, 点击鼠标右健并选择
“Export⋯”将此代理对象保存成文件,最后在客户
端将此文件导入即可。导入以后,在客户端就可以
通过此代理对象来调用NVO的函数了。
4 实例
其中DTS已经建立了与数据库服务器的连
接,数据窗口中显示的是所有的数据; Client并没
有数据库接口,而是通过DTS间接的访问数据,在
数据窗口中显示的是所有男性职工。该程序的大
部分源代码如图2、3:
2 DTS



3 TDS



4. 1 DTS:
4. 1. 1 首先定义一个全局变量: Transpor tmytrans;
4. 1. 2 在“开始监听”按钮中输入如下代码:
longll
mytrans = createtransport
mytrans. driver =“winsock”
mytrans. app lication =“5000”/ /端口号
mytrans. location =“. ”/ /本地服务器
ll =mytrans. listen ( ) / /开始监听
ifll < > 0 then
messagebox( string(mytrans. errcode) ,mytrans. errtext)
return
endif
server. settranspool ( 12, 16, 10) / /设置连接缓冲,注意
“server”为应用的名称
this. text =“正在监听中. . . ”
this. enabled = false
4. 1. 3 在“结束监听”按钮中输入如下代码:
mytrans. stop listening( ) / /结束监听
destroymytrans
cb_1. text =“开始监听”
cb_1. enabled = true
4. 1. 4 建立一个NVO:
利用PB 的UserObjects 画板建立一个
classàcustom 的用户对象, 建立用户对象函数
nvoretrieve ( refblob buffer, string filter) return slong,
函数体如下:
longll
SQLCA. DBMS =“ODBC”
SQLCA. AutoCommit = False
SQLCA. DBParm =“Connectstring = ’DSN = person’”
connect; / /建立与数据库的连接
datastore datastore_buffer
datastore_buffer = create datastore
datastore_buffer. dataobject =“dw_person”/ /dw_person
是一个数据窗口
datastore_buffer. settransobject ( sqlca)
datastore_buffer. retrieve ( )
datastore_buffer. setfilter ( filter)
datastore_buffer. filter ( )
ll = datastore _ buffer. getfullstate ( buffer) / /函数getfull2
state ( )和setfullstate ( )常用于分布式应用程序。
disconnect;
returnll
4. 1. 5 建立NVO的代理对象
在用户对象上点鼠标右健, 选择“Set Proxy
Name”,输入“NVO_dw”,保存用户对象。打开Li2
brary画板,将“NVO_dw”输出为文件,以便在客户
端导入该代理。
4. 2 Client:
4. 2. 1 打开L ibrary画板,将刚才输出的文件导入
4. 2. 2 定义两个全局变量:
connection myconn
nvo_dwp roxy_dw
4. 2. 3 在“连接”按钮中输入如下代码:
longll
myconn = create connection
myconn. driver =“winsock”
myconn. app lication =“5000”/ /必须和DTS端的端口
号一致
myconn. location =“192. 168. 6. 1”/ /DTS的IP地址
ll =myconn. connecttoserver ( ) / /建立连接
ifll < > 0 then
messagebox( string(myconn. errcode) ,myconn. errtext)
  return
endif
this. text =“正在连接中. . . ”
this. enabled = false
cb_2. enabled = true
cb_3. enabled = true
4. 2. 4 在“断开”按钮中输入如下代码:
myconn. disconnectserver ( ) / /断开连接
destroymyconn
cb_1. enabled = true
cb_1. text =“连接”
cb_3. enabled = false
this. enabled = false
4. 2. 5 在“查询”按钮中输入如下代码:
longresult
blobbuffer
myconn. createinstance (p roxy_dw) / /建立代理对象
result = p roxy_dw. nvoretrieve ( buffer, " sex = ’M ’" ) / /检
索所有男性职工
result = dw_1. setfullstate ( buffer) / /dw_1是一个数据窗
口控件
5 结论
以上程序在W INDOWS’98、PB6. 0环境中调试
通过,在客户数量很多,数据量很大的情况下,查询
的速度会快很多。
编程时注意,如果NVO的函数体发生变化,则
无须重新生成代理;如果NVO的函数接口发生变
化,则必须重新生成它的代理并将它输入到客户
端中。
NVO对象是一个不可视对象,只能通过函数
调用的方法使用,不可将它作为一个控件放在窗
口上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: