计算机应用研究
APPLICATION RESEARCH OF COMPUTERS
2000　Vol.17　No.5　P.67-69



基于三层C/S计算模式的OPAC的设计和实现
王晔　张福炎　黄伟红　闵峰
摘  要  该文详细讨论了客户机/服务器的多层计算模式，阐述了基于三层客户机/服务器模式的Oracle Application Server 的结构和实现机理，并给出了设计和实现联机公共查询(OPAC)的方法和实例。
关键词  客户机  服务器  Web  数据库
1  引言
　　计算机技术和网络技术的迅猛发展和普及正在改变着传统图书馆的服务模式，同时也对图书馆自动化系统提出了更高的要求。图书馆的信息服务正向着电子化、数字化、远程化、资源共享化的方向发展，支持Internet服务已经成为新一代图书馆自动化系统的重要标志。
　　江苏省教委资助开发的汇文文献信息服务系统是江苏文献保障系统(JALIS)的一个重要组成部分，是基于多种平台(Windows NT、UNIX等)和大型数据库(Oracle)，采用客户/服务器体系结构的新一代图书馆管理系统。该系统已在全国范围内数十家高校及公共图书馆安装使用，推动了图书馆业务的标准化、电子化，取得了巨大的社会效益。从功能上,该系统包括采访、编目、典藏、流通、期刊、统计、Z39.50和OPAC等多个子系统。
　　在OPAC(Online Public Access Catalog)系统中，我们采用Oracle Application Server构建了三层C/S体系结构，以提供面向Internet的高效的交互式的查询访问,实现了书目查询、读者信息服务、新书通报、书刊订购征询和书刊续借预约等服务。
2  客户/服务器体系
　　客户/服务器计算体系，通常被描述为两层或多层模式，这取决于应用逻辑层在客户端和服务端如何分布。最小的客户/服务器体系只有客户端和服务端。应用逻辑层分散于客户端和服务端。如图1所示。

图1普通两层C/S模式
　　这种C/S模式提高了数据处理系统的开放性,在数据资源与应用软件之间实现了较好的独立和数据应用的分离。现在的许多应用系统中，这种两层的C/S模式是比较成熟的技术，在大部分的应用中也获得了优越的性能。但是这种模式有许多不足之处，客户端同时包括表示逻辑和部分应用逻辑,是一种肥客户方式。随着应用的复杂,对分布在客户端的应用系统的维护代价相当大。同时由于应用逻辑被分散在客户和服务端，对系统的设计和实现增加了复杂度和维护的难度。
　　针对两层C/S模式的不足，将两层结构拓展为三层结构，把客户端和服务端中的应用逻辑剥离出来，单独驻留在中间层，即应用逻辑层，使得服务端只负责数据服务，客户端只负责表示逻辑和应用程序界面。对客户端的设计和开发也因此变得简单，同时也减轻了客户端应用的负担，这种模式下的客户端称为瘦客户端。在实际的应用中，作为应用逻辑一部分的存储过程和触发器等还是驻存在数据库服务器中，以获得数据库全面的支持和优化的性能。本系统的OPAC子系统就是三层C/S结构的成功范例。
3  OAS结构
　　Oracle的网络计算模式(NCA)是一个三层计算模式，其中Oracle Application Server(OAS)作为三层模式的中间层，即应用逻辑层，其结构如图2。

图2基于OAS的三层C/S模式
　　在这个瘦客户端的3层结构中，客户端软件是轻量级的，可以按需求下载，主要用于表示服务端应用的用户接口。应用逻辑层的主体在中间层实现或以PL/SQL存储过程和JAVA过程的形式存储在数据库中。
　　作为3层结构的中间层，OAS提供了与客户端和数据库之间的优化接口。OAS支持以下多种应用:
　　．通用网关接口(CGI)应用
　　．插件服务器
　　．JCORBA应用
　　．企业JAVABeans应用
　　在OPAC的实现中,我们只需支持HTTP的访问,为了动态地存取Oracle数据库中的信息,选用了OAS的插件(Cartridge)服务和静态HTML文档服务。下面详细介绍OPAC系统中所使用的OAS关键组件和技术：
　　监听器
　　OAS提供自己的Web监听器，也支持其它多种监听器。并能够使它们共同工作，并和分配器紧密集成在一起，获得优化的性能。
　　分配器
　　分配器管理一组运行在一个或多个节点上的插件实例，每个插件服务器运行一个或多个插件实例(如图2)。每个节点只有一个分配器。在分配器中维持一个缓冲表，记录着当前可用的插件。 当一个请求某个插件的访问到达时,分配器把它传递给缓冲表中适当类型的插件。如果在缓冲表中没有可用的插件,分配器请求OAS在现存的插件服务器中生成一个新插件。如果现存的插件服务器已经不能再处理更多的插件，OAS就生成一个新的插件服务器，并且在这个新的插件服务器中生成一个新的插件。然后分配器把这个新的插件加入它的缓冲，并把将到的访问请求分配给这个插件。当请求完成后，这个新的插件可以继续为新的请求所使用。
　　插件和插件服务器
　　OAS提供了一种功能更强大、更有效的服务端应用，称为插件服务器。一个插件是一个共享库，实现了程序逻辑或提供了对存储在其它地方，如数据库中的程序逻辑访问。插件服务器是一个进程，其中运行一个或多个插件实例。插件实例是在插件服务进程中执行插件代码的CORBA对象。
　　不像CGI程序，插件服务器不必为每一个请求重新启动。OAS监听器和分配器组件根据当前的服务配置对进来的请求分配并运行插件服务器。处理请求的插件服务器不必在接收访问的同一机器上运行，而允许在多台机器上分配。这种特性插件服务器很容易扩展，能够自动适应高负载需求。
　　在OAS中支持多种插件服务,如PL/SQL插件、JWEB插件、C插件、LiveHTML插件和Perl插件，根据不同的插件可以构建不同的应用。
　　应用和插件是在应用服务器环境中构建应用的两个主要的对象。一个插件包括了执行应用逻辑的代码和定位应用逻辑的配置数据。比如PL/SQL插件包含了使之能连接Oracle数据库和执行PL/SQL存储过程的执行代码。插件的配置数据说明连接到哪个Oracle数据库及连接所用的用户和密码。同时，插件也能与应用服务器的其它组件通信。插件包含在应用内。一个应用包含一个或多个插件，但这些插件必须属于同一种插件类型。每个应用和插件运行在一个插件服务器进程内。每个插件服务器进程只能运行一个应用。
　　当一个应用运行时，其插件服务器进程使用进程的插件工厂对象初始化插件。一旦初始化后，就由插件处理来自客户端的请求。例如，在图3所示的应用中，A运行了三个插件服务器，两个属于应用1，一个属于应用2。在插件服务器1，即应用1的一个实例中，运行着插件C1的两个实例和插件C2的两个实例。插件服务器中的插件工厂对象负责初始化插件C1和C2。

图3插件和插件服务器
　　在OPAC的实现中我们使用了PL/SQL插件，最大限度的利用数据库服务器优异的性能。PL/SQL插件允许用户使用在Oracle数据库中的存储过程来构建应用。每个PL/SQL插件都伴随着一个DAD，用来记录访问数据库的配置数据。在DAD中指定数据库的DSN和用户来确定一个数据源及其对该数据源的访问权限。一个PL/SQL插件也伴随着一个虚拟路径。通过这个虚拟路径来调用相关的PL/SQL插件。可以把一个或多个PL/SQL插件及它们的配置数据组成一个应用。应用的概念使得一组插件可以作为一个整体来管理，因为所有的插件都在同一个插件服务器进程中运行。
　　当OAS接收到一个请求时：
　　1)监听器接收到客户端的一个请求，决定谁应该处理它。在OPAC系统中，它把请求传递给WRB(Web Request Broker)，因为这个请求是关于插件的。
　　2)根据虚拟路径，WRB决定PL/SQL插件应该处理这个请求，然后把这个请求传递给运行这个应用的插件服务器进程。
　　3)在插件服务器内，PL/SQL插件根据DAD的配置数据确定要连接的数据库、设置PL/SQL客户。
　　4)PL/SQL插件连接数据库，准备调用参数，然后调用数据库中的存储过程。
　　5)存储过程生成HTML页面，其中可能包括从数据库中动态获得的数据和静态数据。
　　6)存储过程的输出返回到PL/SQL插件和客户端。
　　插件调用的存储过程必须返回HTML格式的数据到客户端。为简化操作，PL/SQL插件提供了一个Web开发工具集(the PL/SQL Web Toolkit)。可以在存储过程使用，以获得请求信息、生成HTML标记、返回头信息等等。
　　使用PL/SQL插件的优点：
　　．应用逻辑层以存储过程的形式存储在数据库中
　　．最大限度地重用已有的存储过程
　　．可伸缩的安全解决方案
　　．具有方便使用动态生成HTML页面的工具集
4  OPAC设计与实现
　　图书馆的OPAC(Online Public Access Catalog)主要面向读者，提供综合信息查询，其结构如图4。

图4OPAC结构
　　下面以书目查询为例说明如何运用PL/SQL插件实现数据库与客户端的连接，响应客户端的请求，获取数据库中相关数据，动态生成HTML页面返回给客户端的过程。读者通过浏览器进入OPAC中的书目查询画面，假设URL为：http://libsys2000.nju.edu.cn/ opac/opac.complex_search，OAS响应这个请求，根据请求的URL中的虚拟路径'opac'选择PL/SQL插件来处理这个请求。PL/SQL连接后台Oracle数据库，调用数据库端opac包中的存储过程complex_search。在这个存储过程中，通过OAS的Web工具集提供函数，如HTP，动态地生成HTML页面，其中直接访问文献类型表，读取文献类型作为生成的HTML页面中书目检索的一个检索条件。
　　存储过程complex_search如下所示：
create or replace procedure complex_search
is
　cursor c is select doc_type_code,doc_type_name from
　　doc_type_code
　where code_use_flag = '1';
begin
　htp.formOpen('opac.adv_search_chk');
　htp.p('<table border="0" width="100%" cellpadding="3">');
　htp.p('<caption align="center"><h1>书刊目录查询</h1> 
　　</caption>');
　htp.p('<tr><td width="50%" height="24"><p align="right">
　　题  名：</td>');
　htp.p(' <td><input TYPE="text" NAME="title" SIZE="20" MAXLENGTH="80"></td></tr> ');
　htp.p('<tr><td width="50%" height="24"><p align="right">
　　索取号：</td>');
　htp.p(' <td><input TYPE="text" NAME="call_no" SIZE="20" MAXLENGTH="40"></td></tr> ');
　htp.p('<tr><td width="50%" height="24"><p align="right">
　文献类型：</td>');
　htp.p(' <td><select name="doctype" size="1"> <option selected value="*">所有类型</option> ');
　for r in c loop
　htp.p('<option value="'||r.doc_type_code||'">'||r.doc_type_name||'</option> ');
　end loop;
　htp.p('</select></td></tr> ');
　htp.p('<tr><td width="100%" height="24" colspan="2" align="center"><input TYPE="submit" VALUE="开始查询">');
　htp.p('<input TYPE="reset" VALUE="重新输入"> 
　　</td></tr></table>');
　htp.formClose;
end complex_search;
　　存储过程complex_search动态读取数据库中数据，产生HTML标记及相关信息，生成的HTML文档，在浏览器IE下显示如图5。

图5书刊目录查询画面
　　在OPAC的实现中，并不是所有的HTML文档都是由PL/SQL存储过程动态生成。对于不需要访问数据库的请求，我们直接使用了静态的HTML页面。当请求到达OAS 时，根据虚拟路径的不同，静态HTML文档直接从OAS服务器中返回，提高了响应的速度的效率。
5  结束语
　　基于三层C/S计算模式的Oracle Application Server与Oracle数据库紧密结合，充分利用了Oracle数据库的强大功能，提供了快速高效的Web服务。OPAC系统在全国数十家高校图书馆的使用中，其优异的性能获得了用户的一致好评。
王晔(南京大学计算机系  南京 210093)
张福炎(南京大学计算机系  南京 210093)
黄伟红(南京大学计算机系  南京 210093)
闵峰(南京大学计算机系  南京 210093)
参考文献
1，Oracle Application Server Document
2，Scott Urman著. Oracle8 PL/SQL程序设计. 北京: 机械工业出版社
收稿日期：1999-12-27
