说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

提高客户机/服务器应用系统性能的一些方法-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
提高客户机/服务器应用系统性能的一些方法-Delphi资料

摘 要 客户机/服务器的应用逻辑设计是否合理

直接影响到客户机/服务器方式应用系统的处理性能。本文以Oracle 7服务器为平台提出一些方法

以确定如何划分应用逻辑

使客户机/服务器应用系统有较高的处理效率。

关键词 PL/SQL 触发子 客户机/服务器

一、问题的提出

80年代末到90年代初

许多应用系统从主机终端方式、文件共享方式向客户机/服务器方式过渡。客户机/服务器系统比文件服务器系统能提供更高的性能

因为客户机和服务器将应用的处理要求分开

同时又共同实现其处理要求(即"分布式应用处理")。服务器为多个客户机管理数据库

而客户机发送请求和分析从服务器接收的数据。在一个客户机/服务器应用中

数据库服务器是智能化的

它只封锁和返回一个客户机请求的那些行

保证了并发性

使网络上的信息传输减到最少

因而可以改善系统的性能。在客户机/服务器系统中

应用的处理是分布在网络上的

所以在设计客户机方数据库应用程序时

若把过多的负担加在网络上

没有充分利用数据库的存储过程

没有把网络访问最小化

结果是应用程序要执行过多的网络I/O

使网络饱和

从而降低了整个系统的性能。要开发好的客户机/服务器应用系统

必须搞清楚如何在组成系统的各部分之间分布应用功能。

本文提出一些方法来确定客户机/服务器数据库系统中哪些功能应放在哪里实现。客户机应用程序主要侧重于用某种方便用户的方式表示和(或)分析数据。开发客户机应用程序时

网络传输量是应重点考虑的问题之一。应注意应用程序如何向数据库服务器发送信息或从数据库服务器接收信息以及发送和接收多少数据。通常客户机/服务器系统上网络I/O是应用程序性能的瓶颈

一个应用程序引起的网络上I/O越少

应用及整个系统的运行情况越好。要从一个客户机应用中消除不必要的网络传输量

需要理解和利用SQL命令及数据库上的其它一些特征。

二、一个例子

下面

我们来考虑这样一个例子:一个数据库应用程序完成显示每个销售订单的所有行的金额合计。

一般算法分两步:

(1)每行项目中数量乘以单价=金额;

(2)把每行金额累加。

第一种方法:

每次一行

然后

用应用程序累加

SELECT orderid

quantity

unitprice

FROM item

stock

WHERE stock.id=item.id

ORDER BY orderid

结果为:

orderid quantity unitprice

1 1 6.03

1 1 21.4

1 4 87.12

2 2 8.97

2 3 21.4

采用这种方法

若业务量增大

则其网络的传输量相应增大。

第二种方法:

让数据库服务器进行计算

然后只把结果从网上取过来

即:

SELECT orderid

SUM(quantity *unitprice)

FROM item

stock

WHERE item.id=stock.id

GROUP BY orderid

ORDER BY orderid

结果为:

orderid SUM(quantity*unitprice)

1 265.87

2 82.14

如上所示

由于第二种查询使用了一个SQL的组合

即一个SQL函数(SUM)以及一个GROUP BY子句

让服务器来执行计算。因此

只需从网上传输较少的数据。

这个简单例子说明:

1.在客户机/服务器环境中如何用SQL函数减少网络上的传输量;

2.开发人员必须完全熟悉SQL才能做出好的客户机数据库应用程序。

三、提高性能的方法

下面我们介绍几种提高性能的方法。

1.使用完整性约束

所有客户机应用程序必须遵循一系列预先定义的数据完整性规划及业务规则

以保证所有数据库数据是合法的。可以使用两种方法来实施一个简单的完整的规则:让应用程序执行完整性检查;使用Oracle7的完整性约束。

(1)让应用程序执行完整性检查

例如

任何一个订单( orders)的顾客号必须是客户机表( customer)中的顾客户机号。这是一个最简单的引用完整性

可以用应用程序本身执行完整性检查。

DECLARE

flag INTEGER;

BEGIN

SELECT id INTO flag

FROM customer

WHERE id=3

FOR UPDATE OF id;

IF SQL%FOUND THEN

INSERT INTO orders

VALUES(5

3

SYSDATE

null

null

'F');

-- 其他应用逻辑

COMMIT;

END IF;

END;

这个过程只是在应用程序内部用于实施引用完整性规则的一种方法

但可以看出

为实施一个简单的完整性规则

应用程序要花大量的时间通过网络来请求和发送数据。(2)使用Oracle 7的完整性约束

CREATE TABLE orders

(

id INTEGER PRIMARY KEY

customer id INTEGER NOT NULL REFERENCES customer

orderdate DATE NOT NULL

shipdate DATE DEFAULT SYSDATE

paidate DATE DEFAULT SYSDATE

status CHAR(1) DEFAULT ‘F' CHECK(status IN(‘F'

‘B'))

);

实施简单完整性规则(如引用完整性)的更好方法是使用Oracle 7的完整性约束。该方法的好处是明显的:

①定义一个表的同时

方便地建立完整性约束

开发人员不需为实施一个简单的完整性规则而创建测试、排错复杂的数据完整性逻辑

提高了工作效率;

②用集中化的方法实现完整性规则;

③无需任何网络I/O

客户机/服务器系统也就不会因为网络访问而降低性能。

2.使用数据库触发器

应用程序经常需要实施复杂的业务规则

这些规则无法用完整性规则表示

所以最好不要按照常规思路在应用程序中实施完整性规则;而是用数据触发子(triggers)来实施业务规则。其优点是容易创建

可集中进行规则实施

避免不必要的网络I/O。利用数据库触发子可以使其他一些应用程序集中化和自动化。比如

计算item 表中的total 列的值是所订零件的数量乘以零件的单价

而零件单价存放在stock表中

当插入一个新的行项目时

应用程序计算total列的值有两种方法。

方法一:让应用程序通过SQL命令执行这个操作

DECLARE total REAL;

BEGIN

SELECT unitprice*quantity INTO total

FROM stock

item

WHERE id=4;

INSERT INTO item VALUES(...);

END

应用程序通过网络发出请求

取得某一些零件单价

然后插入这个含有该行计算值(tota l)的行。修改item表中某行数量值

应用程序需要包含相似的逻辑来计算。此外

多个用户还可能同一时刻插入和修改订单。总之

用这种方法来计算total 列时会在客户机/服务器系统中产生大量的网络传输。

方法二:用数据库触发子

从一个行项目自动导出total 的值

当用户在item表中插入新行或修改quantity时

无需任何网络访问。

CREATE TRIGGER Linetotal

BEFORE INSERT OR UPDATE OF quantity

stockid

ON item

FOR EACH ROW

DELARE

itemprice REAL;

BEGIN

SELECT unitprice

INTO itemprice

FROM stock

WHERE id=:new.stockid;

:new.tolal:=new.quantity*itemprice;

END linetotal;

当创建触发器linetotal后

应用开发人员在编写应用程序时就不需考虑保持total列为最新值的问题

而且网络数据库上所有应用都会因此受益。

3.利用过程和包优化性能

这里主要讨论如何利用完整性约束和数据库触发器把应用逻辑移到数据库服务器中执行以便减少网络I/O

提高性能。

其它类型应用处理逻辑分布到数据库服务器亦可以减少客户机/服务器应用中的网络I/ O

应用程序不必再用包含多个网络操作的SQL语句去执行数据库服务器操作

而是简单且有效地调用存储过程。包是一种用来把多个有关的过程在数据库中封装起来的方法。

下面是用SQL和用存储过程例子的差异:

例如要插入某些行项目的订单

用SQL实现过程:

INSERT INTO orders VALUES(...)

INSERT INTO item VALUES(1

..)

UPDATE stock SET onhand=...

INSERT INTO orders VALUES(...)

INSERT INTO item VALUES(2

..)

UPDATE stock SET onhand=...

INSERT INTO orders VALUES(...)

INSERT INTO item VALUES(3

..)

UPDATE stock SET onhand=...

COMMIT;

要创建一个新销售订单并插入它的三个行项目

应用程序必须用7个不同的的SQL语句来实现

每个语句都要通过网络传输数据

要减少这些SQL语句在客户机/服务器系统中产生的网络传输量

可以创建两个简单的过程来插入订单及行项目。

CREATE PROCEDURE placeorder(custid IN INTEGER) AS

BEGIN

INSERT INTO orders

VALUES(orderseq.NEXTVAL

custid

SYSDATE

null

null

‘F

');

END placeorder;

CREATE PROCEDURE placeitem

(itemid IN INTEGER

partid IN INTEGER

quan IN INTEGER)

AS

BEGIN

INSERT INTO item(id

orderid

stockid

quantity)

VALUES(itemid

orderseq.CURRVAL

partid

quan);

UPDATE stock

SET onhand=onhand-quan

WHERE id=partid;

END placeitem;

应用程序只需简单调用这几个过程。

Placeorder(3);

Placeitem(1

3

2);

Placeitem(2

8

1);

Placeitem(3

9

3);

当一个应用程序调用存储过程时

通过网络发送的数据只有过程调用及参数。本文提出的提高客户机/服务器应用系统性能的方法

主要是采用合理分布处理逻辑于客户机端与服务器端

并充分利用数据库服务器来提高执行速度。该方法的有效性

已在我们开发的多项客户机/服务器应用系统中得到证实。此外

在提高性能的措施和方法中

SQL语句的查询优化问题也不可忽视。综合上述两种方法

才能从根本上提高

客户机/服务器应用系统的性能。

参考文献

1 Steven M.Bobrowski. Mastering Oracle7 & Client/Server

Computing

SYBEX I nc. 1995.

2 Michael J. Corey etc. Oracle数据库性能优化技术

学苑

出版社

1994.

数据分析≠Hadoop+NoSQL,不妨先看完善现有技术的10条捷径 移动周报:百度收购91,19亿美金背后的博弈 植物大战僵尸2:“免费+内付费”模式引发争论 [CTO俱乐部第103期] 高德和四维图新技术高管谈地图导航的发展与挑战 Java 7爆最新漏洞,10年前的攻击手法仍有效 Twitter联合创始人Biz Stone谈Facebook用户体验 提倡零广告 英雄会:企业的人才漏斗 开发者的武林大会 一次错误估算带来的启示 苹果开发者中心被黑:开发者信息或被窃取 SIM卡加密存漏洞 将影响数亿计的手机用户 搜狗茹立云:探索引擎产品落地 浏览器+搜索模式会成主流吗? 大势所趋,IBM Acme Air至少使用Netflix的5个开源工具 【观察】跨越“朦胧期”的云计算:产业、核心技术、生态圈以及突破点 Rovio Account:平台化之路修成正果 甲骨文总裁马克•赫德采访实录:用软硬件集成一体机打垮对手 如何一步一步打造高可扩展性的应用程序? 用Java编程,请保持简洁! 从安全隐患带来的商机来看,Hadoop同样很美 三年增四倍:如今谷歌服务占北美互联网流量四分之一 决战低功耗?Intel明年推低功耗Xeon处理器 在软件架构上增加新功能的注意事项 90后的代码界“女神”李雪:在编程中找到自己的“灵魂” 大数据之路不乏荆棘,然则其中的机遇却高于一切 iPhone销量令人意外:苹果Q3财季净利69亿美元 同比下滑 励志:12位早起的IT大佬们让小伙伴们都惊呆了 独家:苹果5周年限免神作,BADLAND开发者访谈 10亿次订阅!苹果Podcast的里程碑 免费利器Unity 4.2正式发布 支持WP8、Win8和BB10 SDCC 2013:Pinterest首位中国籍工程师两场演讲议题确定 甲骨文公布中国首届“Duke选择奖”名单 Moco、X幻想、开源中国获奖 直接拿来用,10个PHP代码片段 想知道up的意思的,到http://www.csdn.net/expert/topic/196/196434.shtm 各位老大,怎么让主菜单里一部分选项顶左边,一部分顶右边? asp高手看过来!asp高手看过来!asp高手看过来! 大虾请出手,CTreeCtrl 的item项被点击时,得知当前点击的为那一项,谢谢,谢谢 请问在JBuilder中怎么调整控件的位置好啊? 怎么在非客户区添加个按钮?遮住最大化按钮呢?我头都想炸了 请问如何查看WIN2000系统里是否被安装了类似“冰河”之类的软件? 如何打印整个对话框 寻找将realplay录像(ram格式文件)转换成mpeg或avi的软件。 OTDR(TD3000)的接口编程,谁做过!!!!!!!!!!!!请进 百分求方案!!请大家不吝赐教!(报表汇总,打印相关,有一定难度!!!) 干掉最大化按钮! 谁能帮我解释一下Petzold这些话的意思: 绝对给分,谢谢各位大侠帮我解决这个很简单的问题罗!:( 关于古老的DDE通信的几个头痛的问题. yangrenzhi你今天怎么啦,有事就说出来啊 如何获得一个变量的字节长度 关于JAVA的简单问题(送分) 为什么不能筛选数据? 有关Acrobat 组件的错误 关于火车查询 CTreeCtrl 的同一item项被多次点击时,会出发什么消息?你知道吗? WINCE的市场 控件ID有何用? 初学XML,请问ASP传回的中文字怎么是乱码? 请问圆锥体侧面积计算公式是什么?快阿,正在考试!!!!!!!!!!!!!! (♂逍遙剑♂) 过来聊聊!进来! 怎样用文件的形式对数据库进行备份? 能在标题栏添加控件吗?谁能告诉我? 谁知道在Activex控件中事件执行顺序的问题 3山好可怜,被女人抓住了把柄,知道了粗细长短,哎。。。 想在odbc里用程序的方法建立驱动,怎么实现? vc编的DLL怎样处理LIB在BCB中可以直接用哦?我用WINAPI那个约定 救命的!!! 深圳的“同志”好多啊!有一个哥们还向我推荐了一个同志网站,可惜我不是同志,如果有同志需要的话,可以去找那些深圳同志接头! 有懂EJB ,weblogic 大连的朋友吗? to fightwolf:give she some color to see see. 装delphi 6之前是不是要装ie5.5? 现在有一个问题:在大数据量传输的情况下,想采用异步传送方式,请问如何实现? 关于比例问题!! 有人说:做程序员很累,但我很快乐?广大程序员朋友们,有谁同意这个说法吗? 那该怎么办? MFC开发的ActiveX怎么都是OCX,可不可以是DLL,如果可以该怎么做。 如何获得当前活动控件的引用? 哪里有获得指定IP地址的机器网卡MAC地址的源程序? 新手上路:请问系统安全的市场前景如何? 'select * from a where b like ''[as]%'''这一句有没有错呢? 哪能找到 VBScript 5.0 的联机文档 为什么第七期的杂志我还没收到啊!!~~,原以为提前先订几期,会早点收到!唉!~~ php打开CSV文件的问题!答来分去! 各位有用过aspchart这个控件的吗?为什么我不能生成图片呢? 请问:GR CR CP AR 分别表示什么纯度? 一辆玩具车在一条直线上跑,先向后跑了6米,记作-6米,那么玩具车又跑了+6米是什么意思?这时它离移动前的位置有多远? 20mL 0.1mol/L的CH3COOH溶液中和10mL 0.1mol/L NaOH溶液 请列出所有粒子的浓度大到小?请说明为什么这样排 化学试剂规格中的缩写符号GC,BR,2N,AR,CP,LR,GR以及色固分别代表什么? 1.备车 2、停车3、完车4盘车5正车6倒车7飞车8冲车9试车101.备车 2、停车3、完车4盘车5正车6倒车7飞车8冲车9试车10并车11车钟12一车13二车14三车 常温下,用0.1MOL/L的NAOH滴定20ML.0.1MOL/L的HAC溶液.当V(NAOH)=10ML时.溶液中:C(AC-)+2C(OH-)=C(HAC)+2C(H+) 为什么是对的? 请问:GR CR CP AR 分别表示什么纯度阿?(急啊) 朗逸车LAVIDA1.6下面一排小的英文是什么意思 0.1mol/L的硫酸20mL与0.2mol/L的硫酸10mL混合,求混合液物质的量浓度用0.6mol/L的NaOH溶液A与0.1mol/L的溶液B混合配制0.2mol/L的NaOH溶液,求A与B的体积比 购买生物药品时,规格中的:AR,CP,GR,SP,4N,ACS, 一瓶葡萄糖盐水是多少毫升?实际调查噢! 将20ml 0.1mol/L NaOH 溶液和 10ml 0.1 mol/L CH3COOH 溶液混合后并加强热,最终得到的固体是?答案是Na2CO3 什么是产品规格书 5%葡萄糖注射液 500ml 【规格】:500ml,25g 该注射液中葡萄糖的物质的量浓度为5%葡萄糖注射液 500ml【规格】:500ml,25g该注射液中葡萄糖的物质的量浓度为____. 现有25ml盐酸和硫酸的混合液,加入1mol/L的NaOH溶液25ml恰好中和,在中和后的溶液中加过量的Ba(OH)2溶液,所得沉淀质量为1.7475g,求混合溶液中盐酸和硫酸的物质的量浓度各是多少? 什么是“六型”社区?具体内涵是什么? 求该注射液中葡萄糖的物质的量浓度.葡萄糖(C6H12O6) 将100毫升0.2mol/l的NaOH溶液与多少毫升的0.1Mol/L的硫酸溶液混合,才能恰好完全中和 羊绒线的产品规格如何表示?其含义是什么? 医用葡萄糖注射液的葡萄糖的质量分数为5%.密度约为1g/cm³,则此注射液中葡萄糖的物质的量浓度是多少希望稍微详细点 中和100ml 1mol/l的硫酸,需要多少氢氧化钠(质量)? 500ML的水重还是500ML油重?水是食用水,油是食用油. 6分之1的6表示什么含义 500ML的葡萄糖注射液,重量是多少克(大概)?这种葡萄糖注射液的葡萄糖浓度是多少? 500ml水等于多少克 1/6中的6表示什么含义 500ml水中含有25g葡萄糖,该葡萄糖溶液的质量分数 配制500ml质量分数为20%的硫酸溶液,需要质量分数为98%的浓硫酸多少毫升,还要水多少毫升[百分之98的h2so4密度为1.84g/cm3,百分之20h2so4]密度为1.14g/cm3结果精确到0.1ml] 6个7分之一表示的意义是什么 500ml内含葡萄糖25g,先要配制20kg这种葡萄糖注射液,需要葡萄糖多少千克? 有甲乙两个瓶子,甲瓶里装200毫升清水,乙瓶里装200毫升纯酒精.第一次把20毫升纯酒精由乙瓶倒入甲瓶里,二次把甲瓶中20毫升的倒回乙瓶,此时甲瓶里含纯酒精多,还是乙瓶里含水多 15分之8除6分之1表示的意义是什么 5%葡萄糖(C6H12O6)注射液 500mL 【性状】………… 【规格】500mL,25g 1)该葡萄糖注射液中葡萄糖的质量不明白质量分数的计算中是否应当再次加上水的质量,若加了,就变成百分之4.8,若不加则为 有甲乙2个瓶子,甲瓶里装了200毫升清水,乙瓶里装了200毫升的纯酒精,第一次把乙瓶中20毫升纯酒精倒入甲瓶第二次把甲瓶中20毫升的溶液倒回乙瓶,此时甲瓶里含纯酒精多,还是乙瓶里含水多?麻 31,11,36,6,41,1,46,是什么意思46后面应该是-4么? 5%葡萄糖(C6H12O6)注射液 规格:500ml 25g 求该注射液中葡萄糖的物质的量浓度为多少?该注射液的质量分数是多少? 谁知道“ AR Return Error!” 这句话的汉语意思? NBA总决赛,看到有个标语41>6+3+1是什么意思?是指诺维斯基?具体意思? 将25g葡萄糖溶于水,配成500ml溶液该溶液的质量浓度为多少 Ar You The One 1.2 1.6 2. 如何用含结晶水的葡萄糖C6H12O6·H2O配制质量为50.0g/L的葡萄糖溶液500mL?设溶液密度为1kg/L,该溶液的物质 AR Return Error汉语是什么意思?_ 5串1或5串6这些是什么意思 您好 请问如何用含结晶水的葡萄糖配置质量浓度为50g/L的葡萄糖溶液500ml? ar return error的中文意思是什么 5-5-6-5-1代表什么意思 二氧化硫和氧气化合 催化剂是什么? Ar,中文究竟应该怎样翻译?这里的Ar是与Mr相对应的概念,不是argon。 内容管理员,请不要随意推荐。 1.2.3.4.5.6. SO2与O2的混合气体中,O2的体积分数是50%,则该混合气体在标准状况下的密度是 牛皮纸的规格通常会有0.8-1.5这种类似的数据, 10转6股派1. 在标准状况下.2.24升二氧化硫和氧气的混合气体中所含的氧原子数为多少?怎么算的 产品规格什么意思 六串一什么意思 要出去氧气中混有的二氧化硫气体,最好让混合气体通过A 浓硫酸 B 氢氧化钠溶液 C 澄清石灰水 D 蒸馏水 为什么? 什么是产品规格,什么是产品属性? 每辆汽车后面都有一个小数(比如说1.6).这个小数代表什么 10ml 0.1mol/L HCL 与10ml 0.2mol/L NaOH混合,求该混合溶液的PH值.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn