摘 要 客户机/服务器的应用逻辑设计是否合理,直接影响到客户机/服务器方式应用系统的处理性能。本文以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语句的查询优化问题也不可忽视。综合上述两种方法,才能从根本上提高客户机/服务器应用系统的性能。
分享到:
相关推荐
在实际项目中,选择C/S还是B/S架构,或是采用几层架构,通常取决于项目需求、团队技能、性能要求以及未来扩展性等因素。理解这些架构模式及其优缺点,有助于做出更适合项目的决策。 总结起来,C/S和B/S架构分别代表...
C/S系统则强调客户端的定制化和性能优化。在学生-教师系统中,C/S模式可能用于实现更复杂、对实时性要求较高的功能,如在线考试、视频教学等。客户端软件可以提供更丰富的交互体验和更高的处理速度。Java同样能在C/S...
日志文件可以帮助开发者追踪问题的源头,优化系统性能。 8. **性能优化**:为了确保系统的响应速度和稳定性,需要考虑数据库索引优化、查询优化、资源管理等策略,以提高整体性能。 9. **系统集成**:宿舍管理系统...
本系统采用C/S架构,可以实现数据的实时同步,提高用户体验,同时减轻服务器压力。客户端应用程序可以直接调用服务器上的数据库服务,实现数据的存取,保证了数据的安全性。 四、模块化设计 系统根据企业管理需求,...
【C/S系统框架】是一种常见的软件架构模式,它由客户端(Client)和服务器端(Server)两部分组成。在这个框架中,客户端负责用户交互,而服务器端则处理业务逻辑和数据存储。本套框架采用C#语言进行开发,C#是微软...
《医院管理系统的C/S架构与C#实现》 在信息技术高度发达的今天,医院管理系统已经成为医疗机构不可或缺的一部分。本文将深入探讨一个基于C/S(客户端/服务器)架构,使用C#编程语言实现的医院管理系统,该系统涵盖...
【基于C#语言的C/S模式的学生管理系统】是一种典型的客户端-服务器(Client/Server,简称C/S)架构的应用程序,用于高效地管理学生的各种信息。在这个系统中,C#作为编程语言发挥着核心作用,提供了丰富的类库和强大...
在开发C/S系统时,C#的特性如类型安全、垃圾回收、自动内存管理以及强大的面向对象特性(如继承、封装、多态)都为程序员提供了便利。 1. **Windows Forms**:在C#中,Windows Forms用于构建桌面应用的用户界面。在...
通过合理设计C/S架构,不仅可以提高系统的性能和稳定性,还能满足用户对于功能和非功能性需求的多样化要求。未来随着技术的进步,C/S架构还将继续发展和完善,为企业提供更为强大和灵活的信息技术支持。
本系统结合了B/S(浏览器/服务器)与C/S(客户端/服务器)架构,旨在提供一个既灵活又功能丰富的测试环境。下面将详细介绍这两种架构以及它们在在线测试系统中的应用。 **B/S架构** B/S架构,即浏览器/服务器架构,...
在本项目中,我们探讨的是一个利用C#编程语言开发的C/S(客户端/服务器)架构的考试系统。这个系统充分利用了多线程技术来提高性能,并通过Socket实现了TCP/IP通信协议,确保了数据在网络中的稳定传输。数据库部分...
在此背景下,“B/S”和“C/S”这两种主流的系统架构模式变得尤为重要。本文将深入探讨这两种架构的特点及其应用场景,帮助读者更好地理解它们之间的区别。 #### C/S架构(Client/Server架构) **定义:** C/S架构...
C/S架构的程序通常依赖于特定客户端环境,而B/S架构则通过Web浏览器进行访问,降低了客户端的系统需求,提高了系统的可扩展性和维护性。将PB11.5开发的C/S应用转化为B/S,主要涉及到以下几个关键步骤: 1. **分析...
### C/S与B/S并用的高校教务管理系统研究与设计 #### 一、引言 随着信息技术的快速发展,特别是互联网技术的普及,各种计算模式也在不断地演变和发展。其中,客户端/服务器(Client/Server,简称C/S)模式与浏览器/...
C/S结构虽然提供了系统开发层面的开放性,但在实际应用中,往往需要针对不同的操作系统和硬件环境定制开发,增加了软件的多样性和维护成本。相比之下,B/S结构通过Web标准和协议实现了真正的跨平台兼容性,用户可以...
在本文中,我们将深入探讨如何使用Java来实现一个基于C/S(客户端/服务器)架构的聊天系统。这个系统利用了NIO(非阻塞I/O)机制、Socket通信以及多线程IO操作,实现了诸如好友管理、聊天交互以及文件传输等核心功能...
以及可能涉及到的框架如Spring,Hibernate,jQuery等,以提高开发效率和系统性能。 总之,“基于C/S结构的考试管理系统”是一个涉及多层面、多技术的综合性项目,它涵盖了客户端开发、服务器端开发、数据库设计、...
通过学习和研究Delphi C/S考勤系统,开发者不仅能掌握Delphi开发技巧,还能深入理解C/S架构的设计原则和Midas的应用方法,为开发其他类型的企业级应用打下坚实基础。对于希望提升自身Delphi开发能力的程序员来说,这...
- **高性能需求:**对于需要大量计算资源的应用,C/S结构提供了更好的性能支持。 #### 四、B/S与C/S的区别 **硬件环境差异:** - **C/S结构**通常建立在专用的网络环境中,如局域网,通过专用服务器提供连接和服务...