讨论一下使用pb11 webservice开发时三层时如何尽量减少数据交互量
现在好多PB webservice三层的中间件都是用getfullstate和setfullstate来传送和处理数据窗口中数据,也包含这个版块里面的好多例程与网上的例程.如果按照这种办法,要达到EASERVER的性能是不太可能的.
下面是武汉源启的性能测试介绍:
PBntierBuilder:V3.1
PowerBuilder:V9.0
应用服务器:Sybase EAServer 5.3
适配器:PB WinForm+EAS IIOP
数据库:MS SQLServer2000
带宽状况:
武汉-武汉同城武汉(服务端,10M 专线)- 武汉(客户端,1M ADSL)
武汉-北京异地武汉(服务端,10M 专线)- 北京(客户端,2M 有线电视宽带)
武汉-上海异地武汉(服务端,10M 专线)- 上海(客户端,1M ADSL)
武汉-台北两岸武汉(服务端,10M 专线)- 台北(客户端,2M ADSL)
测试环境
检索(Retrieve)不同记录条数下的耗时情况(秒)
100 行1000 行10000 行100000 行
本地局域网( 0.062 0.172 0.390 1.953
互联网
武汉-武汉同城0.172 0.110 0.563 7.688
武汉-北京异地0.109 0.171 0.905 7.613
武汉-上海异地0.188 0.171 0.625 5.093
武汉-台北两岸0.330 0.410 0.941 6.469
当然,不知道它服务器是什么配置,搞不好是4核+16G内存的,另外每条记录中的字段数也没说明,呵呵..
如果只有一个数值字段的话,那么就不用EASERVER,用我这种方式也能达到这个水平了.
我现在的服务器是WIN2003,赛扬2.93G+2G内存+3M ADSL,硬盘是7200转的普通串口硬盘.
客户端AMD双核2.1G+2G内存+2M ADSL (同城)如果网络正常的话
100行 10个字段 压缩后为906BYTE: 0.3至0.5秒
7000行 2个字段其中一个为100个字符 压缩后为61300BYTE: 2.5-5秒
感觉有时候快有时慢,但上面的数值为平均值(不要开迅雷或者其它下载软件,不然速度立即下降很多),我想这个跟网速多少也有点关系.
不使用getfullstate/setfullstate方法,使用下面方法流程:
1.客户端送入数据窗口名称(千万不要上传语法,这样又不见了几K的数据量),服务器端根据数据窗口名称从PBD或者数据库取得语法后,生成数据窗口,检索数据.
2.服务器端对数据窗口使用saveas函数(不知道能不能使用object.data)来获取,压缩后回传.
3.客户端使用importfile导入数据,导入后更改各行STATUS,让其保持retrieve后状态.
4.客户端修改数据,保存更新的时候使用getchange获取数据压缩后传送到服务端.
5.服务端接到数据后,用setchange函数后update数据窗口.
需要注意地方:
1.服务端SAVEAS数据后,必须把所有DDDW也saveas并按数据窗口方式回传,这样子才能处理下拉子数据窗口.
2.对于有分组的数据窗口,不知道这种主要获取数据后,分组有没有问题,未测试.
3.如果数据交互速度提高了,可以将业务和控制处理功能放在客户端,但是这样子处理的话,好像就不是三层结构了.
4.如果业务控制和处理放在服务端,则不能使用这种方式,这种方式会丢失数据窗口大部份状态和标识.
5.交互数据时,如果数据超过一定值,最好采用分页并且分段传输,这样不会给客户感觉死机了一样.
getfullstate:其实就是整个数据窗口复制.包括语法,数据,缓冲区数据,各行列状态.如果采用getfullstate,客户端是不用放数据窗口的.
setfullstate:与getfullstate对应.
getchange:类似getsqlpreview,只是取数据窗口部份修改内容,我分析过里面的数据,不外是inset into .. values...和update ...set a=... where a...和delete等语法.如果没有修改的数据是不会生成语法的.
setchange:与getchange对应.
其实不使用getchange/setchange,而且通过打包上传getsqlpreview(),服务端进行setsqlpreview后来更新数据应该也是可行的办法,不过没有测试过.
希望大家讨论一下,看看还有没有别的更好的办法来提高使用WEBSERVICE开发三层的性能.
不是说PB做网络应用性能不行,只是有很多地方都没有研究透.
国庆放假在家,突然想起这个问题,写得比较乱,见谅.