频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

优化你的PowerBuilder程序(1)

作者: 51cto.com整理 出处:51cto.com  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2005-09-21 10:10
关 键 词:优化  D  I
阅读提示:本文介绍如何优化PowerBuilder程序,提高执行效率,提高代码的可重复利用性,提高程序的可读性

一、处理 SQL 语句

1、缓冲 SQL 语句

在应用程序中,有时需要反复调用同一组 SQL语句,在这种情况下,可以通过在应用中为这些 SQL 建立缓冲区来提高执行性能。在缺省情况下,SQL 语句的缓冲区是关闭的,你可以通过如下语句打开它: 
SQLCACHE = n
n 表示装入缓冲区的 SQL 语句数量(缺省为0)

例如:

dw_1.SetTransObject(sqlca)
SQLCA.dbParm = "SQLCache = 0"
dw_1.retrieve()

如果将上例的 "SQLCache = 0" 改为 "SQLCache = 25",此句的执行效率将提高五分之一左右。但应注意缓冲区的大小,否则也将影响程序执行的性能。

注:此方法对用 ODBC 和 ORACLE 连接的数据库非常有效。

2、捆绑变量

请看下例:
SQLCA.DBPARM = "DISABLEBIND=1"
INSERT INTO DA_DH VALUES("1","河南0")
INSERT INTO DA_DH VALUES("2","河南1")
INSERT INTO DA_DH VALUES("3","河南2")
INSERT INTO DA_DH VALUES("4","河南3")
INSERT INTO DA_DH VALUES("5","河南4")
INSERT INTO DA_DH VALUES("6","河南5")  

这里未使用捆绑变量,在插入是 PB 将重新处理每个带有新值的SQL语句。

如果将上例改为:

SQLCA.DBPARM = "DISABLEBIND=0"
INSERT INTO DA_DH VALUES("1","河南0")
INSERT INTO DA_DH VALUES("2","河南1")
INSERT INTO DA_DH VALUES("3","河南2")
INSERT INTO DA_DH VALUES("4","河南3")
INSERT INTO DA_DH VALUES("5","河南4")
INSERT INTO DA_DH VALUES("6","河南5")  

则系统将把 INSERT 语句按如下格式进行处理:   INSERT INTO DA_DH VALUES(?,?) 

其中 "?" 称为占位符。系统性能将有所增强。

3、用数据窗口代替 SQL 语句

通常,为了获得某些数据,采用数据窗口和 SQL 语句都是可行的,但是PB 对数据窗口和 SQL 语句采用不同的处理机制,因此,具有不同的效率。

例:为里检索电话档案中的用户名,可以利用 SQL 语句,将所有的数据检索到一个多行编辑中,也可以检索到一个数据窗口中。

如果使用第一中方法:首先定义一个游标:

DECLARE CUR CURSOR FOR  
SELECT "DA_DH"."HM"
FROM "DA_DH";

然后可以:

STRING stxt[],st
int li
open cur
do li = li + 1
fetch cur
into :stxt[li] ;
st=st+stxt[li] + "~r~n"
loop while stxt[li]<>""
close cur;
mle_1.txt = st

也可以使用第二种方法: 

dw_1.settransobject(sqlca)
dw_1.retrieve()

利用 POWERBUILDER PROFILER 工具进行检查,对比两种方法所需时间如下

方法                     所需时间 (百分之一秒)
SQL 语句     100.9857
数据窗口                49.0133 

由于数据窗口或 DATASTORE 使用了标准的内嵌的代码,而不是有开发人员进行全部编码,同时编译执行的速度比解释执行的速度快的多,因此在开发过程中应尽量使用数据窗口和DATASTORE..即使是必须用 SQL 语句的时候,也应该尽量将它们定义为存储过程(特别是在多用户的环境中),以提高应用程序的性能. 
二、数据窗口的编程和执行

数据窗口是PB最值得被称道的, 其具有如下特点:

1. 多种显示方式.
2. 多种编辑方式.
3. 使用方法简单.
4. 具有多种报表形式.
5. 可实现屏幕滚动.
6. 可实现数据的有效性校验.
7. 执行性能显著提高.
8. 编程工作变少.
9. 可以在数据窗口内部实现数据哭的更新.

下面, 我将介绍一些用于提高数据窗口性能的技术.

1. 减少连接数据库的次数

连库操作是非常影响执行速度的操作. 因此在程序中,一旦与数据库连接后就应当尽量保持与数据库的连接, 减少连接数据库的次数.PowerBuilder 提供里两个函数来建立数据窗口与事务对象的连接:

SetTrans()  
SetTransObject()

在程序中应当尽量使用 SETTRANSOBJECT(), 因为SETTRANS() 函数在每次调用 RETRIEVE(), UPDATE() 等函数之后, 都要执行数据库的连接和断开操作.

2. 下拉数据窗口与表的连接

对于数据库服务器来说, 表的连接操作是一项非常大的开销, 而 POWERBUILDER 提供的下拉数据窗口在某些情况下可以代替表的连接操作.例如, 为了在数据窗口上显示用户的电话号码和姓名:如果用表的连接的方法, 数据窗口对应的 SQL 语句应是这样的:

SELECT "DA_DH"."DHHM",
"DA_HTH"."DWM"
FROM "DA_HTH",
"DA_DH"
WHERE ("DA_HTH"."DHHM"="DA_DH"."DHHM")

同样的程序可用下拉数据窗口来完成, 这里不再具体介绍.但是, 应当注意, 以上两种方法究竟哪一种数据更快, 与表的结构, 表的数量, 连接的方法等均有关系, 应当具体分析.

3. 共享数据

在一个应用程序中, 某些数据需要频繁的使用, 如果在每次使用时都从数据库中进行检索, 则需占用大量的服务器资源和网络资源. 为了减少开销, 可以在客户端对这些数据只进行一次检索, 然后允许其它任务共享这些数据. 

例如, 如果有两个数据窗口, 都需要从第三方表中检索出用户的电话号码, 且此列用下拉数据窗口给出. 如果每次都对电话号码进行检索, 则性能较低. 因此, 可以单独建立一个关于电话号码的数据窗口. 在每次打开窗口时, 首先将电话号码检索到此数据窗口中, 然后另外两个数据窗口中关于电话号码的下拉数据窗口可以共享此数据窗口中的数据.

在窗口的 OPEN 事件中编写如下程序:

dw_1.settransobject(sqlca)
dw_2.settransobject(sqlca)  
dw_3.settransobject(sqlca)  
// 检索 dw_1  
dw_1.retrieve()
// 使 DW_2 的下拉数据窗口共享 DW_1
datawindowchild child1
dw_2.getchild('dhhm',child1)
child1.settransobject(sqlca)
dw_1.sharedata(child1)
// 使 DW_2 的下拉数据窗口共享 DW_1
datawindowchild child2
dw_3.getchild('dhhm',child2)
child2.settransobject(sqlca)
dw_1.sharedata(child1) 

使用这种方法, 避免了各个数据窗口间物理的拷贝数据, 因此减少了空间上的开销,提高了应用程序的综合性能.

4. 数据窗口间数据的拷贝

如果需要在数据窗口间共享数据, 应当尽量使用 SHAREDATA() 函数, 但是, SHAREDATA() 函数并不是物理地在数据窗口间拷贝数据, 如工在显示数据的同时, 还要对数据进行操作, 则需要进行数据的拷贝.

例如, 要求将 DW_1 中选定的行拷贝到 DW_2 中:

在窗口的 OPEN 事件中编程:

dw_1.settransobject(sqlca)
dw_2.settransobject(sqlca)
dw_1.retrieve()

在数据窗口 DW_1 的 ROWFOCUSCHANGED 事件中编写下列程序:  

long lr  
lr = dw_1.selectrow(0,false)
lr = dw_1.getrow()
lr = dw_1.selectrow(lr,true)

要完成从 DW_1 到 DW_2 的拷贝工作, 有两种方法:

第一种:  在按钮 "拷贝" 的 CLICKED 事件中编程

long lr  
lr = dw_1.getselectedrow(0)
dw_1.rowscopy(lr,lr,primary!,dw_2,100,primary!)

执行程序, 利用 POWERBUILDER PROFILER 得出所需时间为 1.7034(百分之一秒)

第二种:  

在按钮 "拷贝" 的 CLICKED 事件中编程

dw_2.object.data = da_1.object.data.selected

执行程序, 利用 POWERBUILDER PROFILER 得出所需时间为 0.8062(百分之一秒)


共2页: 1 [2] 下一页
【内容导航】
发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看51744次)
·UML类图详解 (查看46336次)
·Java编程开发手册 (查看24866次)
·UML统一建模语言 (查看23863次)
·C#技术开发指南 (查看21930次)
·Java编程开发手册 (1195个砖)
·Java基础教程 (429个砖)
·C#技术开发指南 (304个砖)
·PB开发教程 (220个砖)
·.NET开发手册 (217个砖)
·Java编程开发手册 (653个好)
·Java基础教程 (569个好)
·.NET开发手册 (248个好)
·PB开发教程 (208个好)
·Delphi开发技术手册 (174个好)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有