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

来源:互联网 发布:大数据概念 编辑:程序博客网 时间:2024/05/29 14:50

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

NamedPipesOpenClientServerLocal, 由于W in2

sock的通用性,一般情况下都选择WinsockAp2

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: DTSIP地址

方法:

ConnectToServer ( ) :其调用方法是connection.

ConnectToServer ( ) ,即连接DTS,如果调用成功则

返回0,显然在调用该函数之前, DTS必须处于监

听状态。

DisconnectServer ( ) :其调用方法是connection.

DisconnectServer ( ) ,即断开与DTS的连接。

Create Instance ( ) : 其调用方法是connection.

Create Instance ( variable) ,即建立一个NVO的代理

以便调用NVO的相关函数。注意在调用该函数之

,必须保证客户端已经与DTS建立了连接。对

NVONVO - Proxy对象,DTS中建好NVO

,为了在客户端设置其代理,可以先在DTS中设

置本地代理,然后将此代理输出到客户端。具体设

置方法如下:PB 的用户对象画板中,在用户对

象上点击鼠标右健,选择“Set Proxy Name,输入代

理对象的名称并存盘,打开PB L ibrary画板,

到刚才保存的代理对象, 点击鼠标右健并选择

Export”将此代理对象保存成文件,最后在客户

端将此文件导入即可。导入以后,在客户端就可以

通过此代理对象来调用NVO的函数了。

4 实例

其中DTS已经建立了与数据库服务器的连

,数据窗口中显示的是所有的数据; Client并没

有数据库接口,而是通过DTS间接的访问数据,

数据窗口中显示的是所有男性职工。该程序的大

部分源代码如图23:

2 DTS

3 TDS

圖片003

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/ /DTSIP地址

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’98PB6. 0环境中调试

通过,在客户数量很多,数据量很大的情况下,查询

的速度会快很多。

编程时注意,如果NVO的函数体发生变化,

无须重新生成代理;如果NVO的函数接口发生变

,则必须重新生成它的代理并将它输入到客户

端中。

NVO对象是一个不可视对象,只能通过函数

调用的方法使用,不可将它作为一个控件放在窗

口上。