用PLSQL和Java开发Oracle8i应用程序.doc_第1页
用PLSQL和Java开发Oracle8i应用程序.doc_第2页
用PLSQL和Java开发Oracle8i应用程序.doc_第3页
用PLSQL和Java开发Oracle8i应用程序.doc_第4页
用PLSQL和Java开发Oracle8i应用程序.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用PL/SQL和Java开发Oracle8 i应用程序简介随着Oracle8i的发布,Oracle 在数据库里支持了二种主要的编程语言PL/SQL和Java。今天,Oracle的许多客户既使用PL/SQL建立数据库应用程序,也使用Java建立数据库应用程序。既然存在二种数据库编程语言,那么就有一个很自然的问题:建立Oracle8i应用程序时,PL/SQL和Java 哪一个更好?我们来快速地回顾一下,PL/SQL给Oracle数据库开发人员提供了强大的功能,包括:高性能、易使用、无缝地与SQL结合,以及强壮性。现在,PL/SQL依旧是一个成熟的开发数据库应用程序的过程性语言,而且是建立SQL密集型和数据密集型应用程序的理想语言。随着Oracle8i的推出,Oracle 在数据库里引入了Java,给这种十分流行的通用语言提供了强壮的、大规模的平台。利用企业JavaBean和CORBA,可以用Java开发多层、面向组件的应用程序;也可以用Java开发传统的数据库存储过程。Oracle8i 提供了多种特性,可以简化用PL/SQL和Java建立应用程序的过程,而且可以容易地把二种语言编写的应用程序组合起来。这份白皮书,提供了有关Oracle8i中PL/SQL和Java特性的技术概述,并就如何利用它们建立应用程序提供了实际可行的指导。白皮书分成四个部分:由于许多Oracle 客户都有现存的PL/SQL应用程序,所以,我们开始时,先描述如何现有的PL/SQL程序与Java组合,扩展现有PL/SQL程序;然后,我们描述二种语言里共有的应用程序编程特性,解释如何把PL/SQL和Java共同使用;在第三部分,描述怎样利用PL/SQL和Java 建立应用程序才算最好(例如:什么时候用PL/SQL最合适,什么时候用Java最合适);最后,我们讨论一些真实的例子,实际演示Oracle的客户们目前在Oracle8i里是如何使用PL/SQL和Java的。用PL/SQL和JAVA建立应用程序开始,我们首先看一下拥有PL/SQL应用程序的客户的场景:客户们想在服务器里增加新的Java代码,从而扩充原有的PL/SQL应用程序。有三个特别的问题需要考虑:第一,Oracle8i里支持的主要存储过程类型是什么,可以用什么途径调用它们;第二,Java在Oracle8i里如何工作,Java如何同PL/SQL互操作;第三,Oracle8i 服务器如何处理PL/SQL和Java之间的名称解析。在整个白皮书里, “Java”这个单词,既指标准的Java,也指SQLJ (Java里的嵌入SQL),只有在明确地表明讨论不同概念时,才表示不同的意思。Oracle8i中存储过程的类型Oracle8i支持的存储过程类型有几种?Oracle8i 支持四种不同类型的存储过程用PL/SQL或Java,都可以实现全部四种类型的存储过程。这四种存储过程类型是:存储过程顶级存储过程允许客户用任意商业逻辑扩展SQL。客户用名称调用存储过程,可以在SQL、PL/SQL包、以及“顶级”位置上调用存储过程。存储函数存储函数实质上与存储过程相同,不同之处在于存储函数向调用者返回值。可以用名称调用存储函数,也可以在SQL、PL/SQL包、以及“顶级”位置上调用存储函数。数据库触发器触发器是与特定的表和视图关联的商业规则,修改对表或视图时,SQL自动调用触发器。Oracle8i 提供了几种类型的触发器:在SQLDML语句执行之前或之后激发的触发器;在每一行更新之前或之后激发的触发器;事件触发器(例如:登录、退出、DDL语句、数据库启动或关闭等的触发器);替代(instead-of)触发器。所有这些触发器类型,都可以用PL/SQL或Java编写。对象类型方法 Oracle8 发行版8.0和Oracle8i提供了用SQL定义复合数据类型的能力。这些对象类型的方法,可以用Java实现,也可用PL/SQL实现。例如,可以用SQL定义一个订单对象类型purchase_order_t,如下所示:CREATE TYPE purchase_order_t AS OBJECT ( pono NUMBER, custref REF customer_info_t, orderdate DATE, shipdate DATE, line_item_list line_item_list_t, shiptoaddr address_t, MEMBER FUNCTION total_value RETURN NUMBER,) ;然后实现这个对象类型的方法 CREATE OR REPLACE TYPE BODY purchase_order_t AS MEMBER FUNCTION total_value RETURN NUMBER IS i INTEGER; stock stock_info_t; line_item line_item_t; total NUMBER := 0; cost NUMBER;BEGIN/ 在这里插入具体的PL/SQL代码或者译Java存储过程的调用。END;在Oracle 8i 里,这四种存储程序类型的每一种,都可以从不同的调用环境调用,这些调用环境是:SQL语句可以在任何SQL语句内部调用函数。顶级CALL语法使用CALL语句,可以在顶级调用过程和函数。CALL是随Oracle8i新引进的语法。PL/SQL块、子程序、包可以在PL/SQL子程序、包或匿名块里调用它们。请注意:Java存储程序自己可以在匿名的BEGIN END 块内被调用。触发器的隐式调用最后,PL/SQL或Java存储过程可以在触发器执行的时候,隐式地被调用。把JAVA与现存的PL/SQL程序结合要想理解如何才能把Java 应用程序和现有的PL/SQL存储过程结合起来,我们首先要理解开发Java存储过程的三个步骤:第一步:编写Java 存储过程:第一步是编写要做成存储过程的Java程序。可以用标准的Java编写,也可以用SQLJ编写因为存储过程通常都是SQL密集型的,所以用SQLJ编写存储过程,是一个效率较高的方法。public class Foo public static String prependHello(String tail) return Hello + tail;第二步:步署、发布存储过程:用Java开发工具编写完Java程序后,要把它装载进Oracle8i。要用Oracle提供的loadjava命令行工具,以源文件、二进制文件、.class类文件、Java .jar归档文件的形式,把Java程序装载进Oracle8i中的目标数据库大纲。Loadjava是一个Java程序,它用Oracle的JDBC驱动程序连接服务器,自动把一组Java程序装载进服务器。(还可以使用CREATE JAVA这个工具,它是SQL*Plus的SQLDDL命令) loadjava -user scott/tigeroudelsrv-1:5521:ORCL Foo.class命令执行之后,会把类foo的方法装入scott的大纲(请参阅第后面有关Java、SQL和PL/SQL名称的内容,了解命名空间解析的问题)。下一步是,把方法登记到SQL上。这一步为什么是必不可少的呢?如果只用PL/SQL,就没有必要显式地把PL/SQL过程登记到SQL上对SQL来说,每个PL/SQL过程自动就是可见的。反之,在使用Java的时候,所有的Java方法对SQL来说都是不可见的要让一个Java方法能够作为存储过程,在SQL里调用它,就必须显式地把它“发布”到SQL当中。Java 类和方法不会自动地发布到数据字典、SQL和PL/SQL里,原因有二:1. Java应用程序里的大多数方法,通常是由其它Java程序调用;而且Java到Java的调用,发生在Java虚拟机环境里,没有必要暴露给SQL。 2. SQL编译器需要有关SQL数据类型到Java数据类型如何映射参数的指导,还需要正确重载调用的信息,以便给出与原始实际参数值对应的SQL数据类型。这需要开发人员的干预,所以只有某些顶级Java方法需要在SQL和PL/SQL里调用。 如何把Java方法发布到SQL和PL/SQL?要把Java程序发布到SQL,只需把顶级的Java入口点暴露给SQL,让SQL能够调用它就可以了。这是什么意思呢?我们来看看一个Java实现的数据库触发器:Java触发器可能有多个类和方法调用。但是,在DML语句执行时,只会调用这些方法中的一个,作为初始调用。之后,Java到Java的调用,就完全是在Java虚拟机内进行的。所以,把Java发布到SQL时,只需把顶级的Java入口点(SQL初始调用的Java类或方法),登记到SQL里就可以了。要把Java 方法发布到SQL,需要声明一个“调用规范”。方法是:用CREATE PROCEDURE语句声明一个过程或函数,并给它定义一个SQL名称,给参数定义与SQL兼容的名称,以及参数和返回类型对应的SQL类型。CREATE FUNCTION PREPENDHELLO (s VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME Foo.prependHello(java.lang.String) return java.lang.String;使用这种技术,只有静态的Java方法,才能从SQL进行调用。从SQL调用Java的另一个方法是使用实例方法。它包括:建立Oracle Objects 对象,用Java方法实现对象的方法。这个技术使用CREATE TYPE BODY命令,提供给数据库的信息与CREATE PROCEDURE命令的信息类似:create or replace type body point is member function jdistance (p point) return number is language java name Point4.distance (Point4) return double;第三步:从SQL或 PL/SQL调用Java:存储过程发布之后,它就象一个PL/SQL存储过程一样。可以用在调用规范里指定的SQL名称,在各种环境里调用它:可以在任何SQL语句内部调用: SELECT prepend_hello(ENAME) FROM EMP;使用CALL格式在顶级调用: CALL prepend_hello(BILL) INTO :x;在PL/SQL过程、包或匿名块的内部,使用与调用其它PL/SQL过程一样的语法调用:DECLAREemp_name VARCHAR;BEGIN emp_name := prepend_hello(BILL);END;从一个实例的方法内部,可以调用Oracle对象的方法,从而调用底层的Java实现: select pt.p, pt.p.jdistance(point(0, 0) from point_table pt;最后,既然所有发布的Java子程序,对SQL和PL/SQL来说,都仿佛是一个PL/SQL子程序内部用Java实现的子程序,那么一个Java子程序就能透明地参与到PL/SQL子程序所发起的服务器到服务器的RPC调用当中,也能参与到远程数据库服务器的SQL发出的分布式事务当中。Java 程序如何访问SQL和PL/SQL? Java 应用程序使用标准的JDBC语法或SQLJ语法访问SQL和PL/SQL。Oracle8i 提供了内嵌的JDBC驱动程序和内嵌的SQLJ 转换器,它们都提供了与Oracle客户端JDBC驱动程序及SQLJ转换器相同的功能,其中包括对所有Oracle专有数据类型的支持(例如ROWID、REFCursors、及Oracle8对象关系类型)。例如,有这样一个用PL/SQL编写的存储函数prepend_hello。要通过JDBC在Java程序里调用这个存储过程,我们使用下面的标准JDBC语法:public class StaticCurJDBC public static String get() throwsSQLException, CoreException DriverManager.registerDriver(new OracleDriver(); Connection con=DriverManager.getConnection(jdbc:oracle:kprb:); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(SELECT prepend_hello(ENAME) FROM EMP);用SQLJ调用PL/SQL函数的示例如下:public class StaticCurJDBC public static String get() throwsSQLException,CoreException String p_name;#SQLSELECT prepend_hello(ENAME) INTO :p_name FROM EMP WHERE empno = :id;请注意这个SQLJ程序:对于Java 存储过程 (例如:在数据库中运行的存储过程),不需要设置连接信息,因为SQLJ转换器会自动得到这个信息。JAVA,SQL, 和PL/SQL名称完全规范SQL名称或PL/SQL名称,标识着同指定大纲有关的大纲对象。例如,名称scott.getname 代表在大纲scott里的PL/SQL存储过程。因为SQL名称是相对于大纲而言的,所以在不同的大纲里,可以使用相同的函数名称。Java中的名称,由解析器规范机制解析,这个机制给出一个排好序的Java名称列表,Oracle的大纲会在列表中进行查找。与Java和PL/SQL有关的命名空间,在数据库里被分隔开。对于已经有PL/SQL存储过程的客户,或者准备用Java和PL/SQL共同编写存储过程的用户来说,这个考虑非常重要。因为数据库把这些命名空间分隔开来,所以用户可以拥有名称相同的存储过程,一个用Java实现,另一个用PL/SQL实现。因为Java存储过程的调用描述器或“调用规范”具有SQL名称,所以标准SQL重载机制会象处理PL/SQL存储过程一样来处理Java存储过程。PL/SQL和JAVA的公共特性现在,我们理解了PL/SQL和 Java 存储过程在Oracle8i 里互操作的方式,下面让我们进一步探讨Oracle8i 为这两种语言提供的公共特性。PL/SQL和Java被设计成共享大量公共特性:公共的库管理和依赖性维护模型,公共的安全和权限模型,公共的纯态(purity)模型,处理大量SQL相关操作的公共机制,以及其它大量公共特性。这些共性,意味着用这两种语言进行程序开发,给开发人员提供了公共的存储过程开发编程模型。下面,我们详细介绍这些特性。库管理特性在Oracle8i服务器里,PL/SQL和Java对象 (源代码、类或 jar 文件)都作为数据库的库单元保存和检索。库单元是Oracle中包、过程、表、视图的基本存储单元。库单元管理两种语言都提供了库管理工具,可以管理所有这些库单元,也能响应来自适当执行引掣的请求,在运行时装入过程和类。自动维护依赖性任意一个用PL/SQL或Java编写的源程序,都支持因为源代码修改,而导致的依赖库自动重编译。它们管理着单元间的依赖信息,以便在更新的时候,提供重新建立依赖单元的自动操作手段。在导入和配置之后,它们会自动把Java和 PL/SQL程序维护成最新。对于Oracle8i里的PL/SQL和Java,数据库服务器也会自动维护PL/SQL和Java之间的一些依赖性。如果修改了发布到SQL里的某个Java 类,相关的Java调用规范也做了修改,反映出新的类,那么所有依赖这个调用规范的PL/SQL包,都会自动重新编译,确保处于最新状态。现在,如果修改了某个PL/SQL存储过程,那么通过JDBC或SQLJ调用这个PL/SQL存储过程的Java 类,并不会自动由系统维护成最新状态。但是日后,随着服务器内SQLJ的增强,我们将提供利用SQLJ类型检测特性的工具,确保通过SQLJ访问PL/SQL的Java类会自动重编译。 (请注意:因为JDBC是一个动态接口,所以JDBC 程序在运行之前,不能检测到这种修改。)安全模型数据库有一个供PL/SQL和Java共同使用的公共安全模型,涉及三个方面的安全:加密、认证、访问控制。网络加密在通过Net8 、IIOP (或8.1.6支持的HTTP)与Oracle8i 里的PL/SQL程序或 Java 程序通信的时候,客户和服务器之间的通信,可以用标准的SSL x.509v3 证书进行加密。认证有两种认证用户的方法:一种是使用标准的数据库用户名和口令,另一种是使用SSL 证书本身。访问控制用户得到服务器的认证之后,就需要拥有执行指定存储过程的权限。PL/SQL存储过程和 Java 存储过程都支持二种权限模型:定义者权限意味着存储过程执行时,使用的特权,是定义该过程的用户所具有的特权;调用者权限意味着存储过程执行时,使用的特权,是调用该过程的用户所具有的特权。使用调用者权限的程序,将继承调用该程序的用户的特权和名称解析模板(上下文)。如果安装那些通用的、在执行时代表调用用户进行操作的通用软件组件时,调用者权限则非常有用。因为调用者权限组件会自动继承调用者的上下文环境,所以可以仅安装组件的单一拷贝,就供给多个用户调用。纯态模型在Oracle8i之前,如果用户想在SQL语句里调用函数,必须指定它的纯态级(例如:函数是否读/写数据库或包的状态)。具体操作是通过RESTRICT_REFERENCES 限制完成的。编译器使用这个纯态信息,把它和额外计算出的信息组合在一起,最后判断执行这些操作是否安全。这个限制通常是非常严格的,而且禁止了编译时允许进行的一些操作。Oracle8i 简化了纯态模型。在Oracle8i 里,在编译时不再必须支持这个限制。取而代之的是,在运行时把非法操作标记出来。这种简单的技术比限制技术更灵活,也更容易使用,而且它对PL/SQL和Java的支持是一致的。访问SQL因为运行在服务器里的存储程序通常是数据密集型的程序,所以Oracle8i里的Java 和 PL/SQL都为支持SQL访问提供了优秀的特性。静态SQL支持PL/SQL和SQLJ提供了直接把静态SQL语句嵌入到PL/SQL程序和Java程序里的语法。在编译的时候,PL/SQL和SQLJ都会检测下列内容的正确性:SQL语法,宿主变量与调用它们的SQL语句的类型兼容性(仅指SQLJ,因为PL/SQL拥有与SQL相同的数据类型),根据数据库大纲里表、视图、存储过程等的定义,确定查询本身的正确性。在编译期间检查SQL语句,让程序开发人员可以在编译的时候,而不是在运行时,就检测到语法错误和语义错误(例如:类型不匹配错误)。动态SQL支持动态SQL支持,提供了对动态SQL程序的支持。动态SQL程序是指这样的一些PL/SQL和Java程序:只有在程序执行的时候,才能确定程序中SQL语句的完整内容。在Oracle8i之前,PL/SQL里的动态SQL语句,只能使用DBMS_SQL包接口才能执行。在Oracle8i里,PL/SQL现在能够支持本机的动态SQL,这同使用DBMS_SQL相比,更简单、更紧凑,也更迅速。动态SQL语句包括: SQL语句 PL/SQL匿名块 数据定义语言 (DDL) 语句 事务控制语句 会话控制语句 (有限制) SQLJ 不支持动态SQL。但是,一个SQLJ程序可能会利用JDBC调用,从而实现动态SQL。SQL子句和JDBC调用,在数据库连接、结果集、结果迭代一级上相互作用。这样,Java和PL/SQL都提供了在程序里组合静态和动态SQL的途径。数据类型支持 Java和PL/SQL对Oracle的SQL类型系统,都提供了广泛的支持,其中包括对下面这些类型的支持: 所有 Oracle 7 SQL数据类型 NUMBER、DECIMAL、INTEGER、FLOAT、REAL、DOUBLE PRECISION、DATE、STRING、CHAR、VARCHAR、RAW、LONG RAW Oracle8 数据类型对象类型(ADT)、集合(VARRAY和嵌套表)、以及LOB (BLOB、CLOB、B文件、NCLOB) PL/SQL提供对这些数据类型的本机支持,因PL/SQL和SQL共享相同的类型系统。Java 提供了oracle.sql.* 这个Java包,里面提供了与每个原始SQL类型对应的Java类,还提供了在SQL类型和Java类型之间转换的功能。其它公共特性最后,PL/SQL和Java在服务器里还有许多其它公共特性。外部过程外部过程提供了一个从SQL、PL/SQL或Java程序里调用外部C/C+程序的机制。外部程序在服务器之外单独的进程空间里运行。外部过程提供了一个简单、易用和安全的方法,把外部系统和3GL应用程序的代码的接口提供给数据库服务器,同时保持了整改事务性的语义。外部过程让应用程序开发人员可以编写C/ C+ 程序,把它们登记成数据库服务器的动态链接库,然后就象调用正常的存储过程一样调用它们。外部过程或外部子程序,可以使用Oracle 调用接口或Pro*C ,反过来在同一个事务里,对数据库进行调用。对于Oracle8i 里的外部过程,有两个新的增强:它们的速度明显提高,可以通过Pro*C调用SQL(从8.0开始,就已经能够用Oracle调用接口访问外部过程)。内置包和库最后,要想用PL/SQL和Java,充分利用数据库里的这么多特性,建立强大的面向服务器的程序,Oracle8i 提供了大量的内置库。PL/ S QL 内置包 PL/SQL特别提供了大量库,可以分成三大类: 应用程序开发包 由可以用来开发应用程序的PL/SQL包组成,包括:(1.) DBMS_PIPE :DBMS管道,用来在会话和DBMS_ALERT之间通信,向用户广播报警;(2.) DBMS_LOCK和DBMS_TRANSACTION:DBMS锁定和DBMS事务,用于锁和事务管理;(3.) DBMS_AQ、DBMS_LOB、DBMS_ROWID、UTL_RAW、UTL _REF:分别操作Oracle的高级队列管理、LOB、ROWID、RAW和RE F特性。 服务器管理包 由数据库和系统管理员用来监视系统操作的PL/SQL包组成,包括(1.) DBMS_SESSION和DBMS_SYSTEM:DBMS会话和DBMS系统,管理会话信息和设置调试用事件;(2.) DBMS_SPACE 和DBMS_SHARED_POOL:DBMS空间和DBMS共享池,取得空间信息,在服务器里保留共享池资源。(3.) DBMS_JOB:DBMS任务,用来调度服务器里的任务。 PL/SQL还为分布式数据库访问提供了大量的包,提供了对快照、高级复制、冲突解决、延迟事务和RPC等特性的访问。 Java 内置库 同样,Oracle8i 提供了大量的Java 库,包括: 核心JDK 库 Oracle8i 支持除了GUI/AWT这部分库以外的所有标准 JDK 库,因为GUI/AWT在RDBMS里没有运行的意义。它支持的有些标准库支持包括:java.lang、java.io、 java.util、 tcp/ ip 套接字支持、java.math任意精度的算术、java.lang.reflect 类型内检、java.text 文本处理/格式化、以及java.util.zip .jar 文件支持。 内置 Java 库 除了标准库之外,Oracle8i 还提供了其它大量Java 库,例如:基于Java的CORBA ORB,企业JavaBean特性,基于Java的XML解析器(在8.1.5里可用,在8.1.6中打包提供),以及Java Web 服务器(8.1.6提供)。 而且,由于Oracle8i 是一个完全符合标准的Java 虚拟机,所以它可以运行大量开发商和应用程序开发工具在市场上提供的各种各样的Java 应用程序和库。 下表显示了一些最重要的PL/SQL内置包和对应的Java等价物的对应关系。因为PL/SQL和Java 在服务器里很容易互操作,所以很容易就能从Java程序里发出调用,执行内置 PL/SQL包或者用Java封装器封装一个PL/SQL类,使得可以从分布式CORBA和企业JavaBean客户调用它。而且,对于PL/SQL和Java,Oracle保证可以从它们访问数据库服务器的特性。PL/SQL包Java等价物DBMS_ALERT没有纯粹的Java等价物。只能通过SQLJ或JDBC调用这个包。DBMS_DDLJDBC 拥有这个功能。DBMS_JOB没有纯粹的Java等价物。但是可以安排一个调用Java存储过程的任务(JOB)。DBMS_LOCK没有纯粹的Java等价物。只能通过SQL或JDBC调用这个包。DBMS_MAIL可以在Oracle8i里运行JavaMail 1.1.1。JavaMail 提供了通过标准Internet协议发送、接收邮件的完整API。DBMS_OUTPUTJava 有一个OutputStream 子类:oracle.aurora.rdbms.OracleDBMSOutputStream。这个子类在DBMS_OUTPUT顶部提供了标准的Java OutputStream API。还有一个存储过程DBMS_JAVA.SET_STREAMS,它把System.out重定向到DBMS_OUTPUT。DBMS_PIPE通过SQLJ或JDBC调用这个包。有关的纯Java功能是:通过CORBA在会话间通信的能力 (请参阅 javavm/examples/corba/session/clientserverserver),但是并不完全是一回事。DBMS_SESSION可以使用JDBC执行对应的ALTER SESSION 语句。DBMS_SNAPSHOT通过SQLJ或JDBC调用这个包。DBMS_SQL使用JDBC。DBMS_TRANSACTION使用JDBC 执行 ALTER SESSION。DBMS_UTILITY通过SQLJ或JDBC调用这个包。UTL_FILE授权 JAVAUSERPRIV,并使用常规的Java IO 入口点(类文件件,文件输出流-FileOutputStream和文件输入流-FileInputStream)。选择JAVA和PL/SQL现在我们已经理解了如何把Java和PL/SQL放在一起使用,并理解了二种语言的公共特性。下面,我们看看,怎样才能最好地利用PL/SQL和Java,建立应用程序(例如,什么时候用PL/SQL最合适,什么时候用Java 最合适)。需要理解三个重要的结论:PL/SQL和JAVA 并存Oracle在Oracle8i服务器里增加Java支持,并不是想用Java取代PL/SQL。相反,加入Java是为了是了为实现二件事:提供快速、大规模的Java平台 Java 越来越多地被用来编写访问数据库的企业应用程序。在Oracle8i里提供安全、大规模、高性能的Java引擎,就可以直接在Oracle8i里运行Java应用程序,数据密集型的应用程序也会运行得更快,规模的扩充也更方便。例如,一些先采用Oracle8i 的客户,已经用Java建立了一套CORBA数据访问服务,用来接收和生成XML数据。他们发现,把XML解析和生成逻辑转移进数据库,然后从CORBA客户调用相同的逻辑时,性能提高了大约35%到47%。同样,由于Oracle8i 为Java编写的CORBA对象提供了大规模的、安全的运行环境,所以许多主要的电信公司计划用Java建立CORBA应用程序,并把程序移植到Oracle8i,以便在标准ORB不支持的这种高端集群硬件配置上运行应用程序。增强服务器提供的特性由于在服务器里加入了Java,Oracle显著扩充了能够在服务器中运行的服务和程序的种类,也扩充了能在数据库里执行的操作的种类。例如,下面是利用服务器里的Java 支持实现的某些功能: 客户能很容易地直接在服务器里运行那些为Web打好包的Java 包,例如XML 工具(用于生成和解析 XML)、JavaMail (发送和接收邮件) 等。 在Oracle8i里,可以直接建立、运行大量面向系统的组件。例如Oracle8i 本身就提供了对Java web服务器和ORB的支持,而Internet文件系统则是用Java建立的。 可以编写复杂的商业逻辑。比如需要复杂树操作的逻辑,象基于规则的配置器或者数据流引掣,这是复杂商业逻辑的很好例子。 每件事都围绕特定的设计目标进行了优化虽然可以把 Java和PL/SQL一起用于建立应用程序,但是,这二种语言是围绕不同的设计点设计的,所以它们更适于实现不同的事情。PL/SQL是围绕SQL优化的PL/SQL是Oracle对业界的标准SQL所做的过程性扩展。它自然、有效、安全地扩展了标准SQL,它支持与SQL数据类型相同的数据类型,提供了大量的语句构造,使得建立SQL密集型的应用程序相当简单。它还集成了数据封装、信息隐藏、重载、异常处理等特性。与Java不同的是,PL/SQL目前并不支持分布式系统开发人员非常熟悉的继承、多态和组件模型。特别要注意的是,在下面这些情况下,用PL/SQL更合适:SQL数据类型更容易使用 因为PL/SQL与SQL之间的天衣无缝,所以可以本机地使用SQL数据类型和操作。例如PL/SQL的数值型操作使用Oracle的数值格式,所以可以使用正常的语法和Oracle的数值精度。如果使用Java,就不得不牺牲正常语法或者Oracle 精度。我们进一步说明:比较一个简单的程序(这个程序不使用SQL),它计算Oracle NUMBER的连续汇总。从0开始,每次增加0.01,一直增加1000次,然后打印结果。比较下面二个例子 第一个用PL/SQL执行这些计算,第二个用Java执行。请注意用PL/SQL进行的例子:因为SQL数据类型同时也是PL/SQL类型,所以只要使用本机加法操作,就可以得到汇总。CREATE OR REPLACE FUNCTION FixedPoint RETURN VARCHAR2 IS cent NUMBER(7,2) := 0.01; total NUMBER(7,2) := 0.00;BEGIN FOR count IN 1 . 1000 LOOP total := total + cent; END LOOP; RETURN Total should be 10, is | total;END;反过来看使用Java完成的例子:使用Java的时候,我们把变量total和cent都声明为类型oracle.sql.NUMBER。然后,有二种方法可以计算序列的汇总值:可以把数据用SQL字节数组的格式保存,然后用oracle.sql包提供的方法 (例如tal.add(cent)进行加法计算;另一个方法是,把数据类型从oracle.sql转化成Java本身的类型,然后使用Java本身的方法执行增加的操作 在这种情况下,会有一些在SQL和Java类型之间进行数据转换的开支,同时,有时还会遇到取整的错误。public classSQLNumber public static String total() throws java.sql.SQLException final NUMBER cent = new NUMBER(0.01); NUMBER total = new NUMBER(0.00); int count; for (count = 0; count 1000 ; count+) / total += cent; total = total.add(cent); String ret = Total should be 10, is + total.stringValue(); return ret; SQL操作更快对于SQL密集型应用程序,PL/SQL要比Java快。特别是在应用程序执行围绕SQL的大量循环时,这种优势表现得更明显:在执行同样的操作时,Java需要把大量数据从SQL类型转换成Java类型,而用PL/SQL,使用bulk操作就能完成。类似地,对于触发器之类的应用程序,PL/SQL的执行也更快。这些程序的特点是:对进入PL/SQL引掣或Java引掣的速度要求,比程序执行的速度要求更高。目前,从SQL调用PL/SQL虚拟机,要比调用Java虚拟机快。PL/SQL也为Oracle8.1.5做了优化,可以执行象字符串连接这样的一些字符串操作。对于计算密集型程序,纯Java执行(方法调用、数据操纵、算法操作等) 要比PL/SQL快。所以,PL/SQL通常更擅长于SQL访问,而应用程序的整体性能,则取决于计算操作和SQL访问之间的比例。如果应用程序的性能由运行时间较长的SQL语句决定,那么在PL/SQL和Java之间的选择,会对程序运行时的性能产生显著的影响。如果主要做SQL访问,那么PL/SQL更简单,而且是目前更有效的选择方案。PL/SQL与数据库的集成更强PL/SQL语言的定义是由Oracle决定的,所以Oracle保证数据库的新特性,可以迅速、无缝地在PL/SQL中体现出来。自治事务是引进、集成新特性的一个好例子。自治事务让客户可以走出调用应用程序事务的环境,执行SQL操作。这些事务语法,让用户可以脱离开调用应用程序的环境,独立地提交或回卷操作,然后返回调用事务,继续执行调用事务。自治事务的操作,不受调用应用程序的事务状态,或被调用事务结果的影响。开发人员从这项特性,可以得到很大好处:可以执行出错日志、审计日志等操作。不管调用事务的状态如何,包可以在不考虑调用程序事务状态的情况下,执行一些编目操作,然后再把控制权返回调用者。PL/SQL提供了一种简单的声明机制来调用自治事务。在Oracle 8.1.5里,Java 程序没有这种能力,虽然在未来的发行版里,可能会通过服务器内嵌的JDBC-XA接口提供与自治事务类似的功能。另一个例子是PL/SQL的远程调用机制。开发人员可以用Oracle的dblink功能,调用远程数据库里的PL/SQL包。由于数据库具有利用dblink引用远程数据库中数据库对象的能力,所以PL/SQL的这项功能,实际上是数据库功能的自然扩展。虽然个机制设置、使用起来很简单,但它确实给PL/SQL开发人员提供了非常强大的分布式、事务性的安全RPC机制。Java 是为计算机和开放分布式计算优化的Java 是一种面向对象的编程语言,具有丰富的类型系统,拥有组件模型,以及其它支持多层分布式计算标准(CORBA和EJB)的特性。Java 有更丰富的类型系统 PL/SQL和SQL共享相同的类型系统。相比之下,Java拥有更加通用、更加丰富的类型系统,这套类型系统,可以表示任何复杂的数据结构,例如:多维数据、图片等。而且,由于Java是一种面向对象的语言,所以提供了继承现有Java类型,轻松建立复杂的类层级体系、任意深度嵌套等级的完美特性。还有,如果要执行的程序只有极少数或没有SQL操作,不象PL/SQL那样用的是精确度高、速度却慢的OracleSQL数据类型,而是利用Java本身的数值数据类型,那么Java虚拟机对这类程序的优化更好。Java 便于开发开放分布式系统 在Oracle8i 里,可以用现代的分布式系统开发方法(例如CORBA服务和企业JavaBeans)开发Java 应用程序。这些分布式系统的机制,在某些应用程序架构里,与传统的数据库存储过程、RPC和高级队列比起来,具有大量优势。特别是在下面这些方面,分布式系统架构有更多优越性: 异种环境集成 由于 CORBA 把客户与服务器的实现隔离开 (例如,服务器的语言和地点),所以提供了一种有效机制,能有效地把不同语言编写的应用集成起来,有效地把应用程序分布到不同服务器上,取得优化的性能和规模性。 异种类型系统 存储过程的客户和服务器之间,使用SQL类型系统进行沟通。相比之下,CORBA客户和和服务器之间,使用IDL类型系统进行沟通,而EJB客户和服务器则使用RMI类型系统进行沟通。后两种沟通方式,比SQL系统灵活。例如,它们提供了更丰富的数组管理能力,可以更容易地在客户和服务器之间传递复杂、多值的属性(例如:类的实例、子类、多维数组、异常)。 模块化的应用程序设计最后,它们强迫开发人员采用正规的方法,用指定服务器组件公共接口的方式来定义应用程序的接口。这样,应用程序的结构更加模块化,程序更容易维护和扩展,还允许多个客户调用这个应用程序。 通过运行CORBA 服务器和企业JavaBeans,Oracle8i 让用户在数据库服务器里,就能以优化的性能运行数据密集型的分布式系统组件。某个主要的防务机构设计了一套CORBA 数据访问服务。他们发现,在Oracle8i 里运行服务的速度,要比在服务器外运行快50%。虽然PL/SQL不提供组件特性,但是因为Java和PL/SQL之间的互操作性,可以把PL/SQL包封装在Java类里,这样就可以从CORBA或EJB客户调用PL/SQL了。Java 是为计算型操作优化的包含复杂的面向对象操作或CPU密集型操作时,Java 比PL/SQL迅速。例如,Java本身支持浮点类型的操作,而PL/SQL要使用SQL的数值类型。而且,在使用Java编译器(NCOMP)进行本机编译之后,Java的性能会明显提高。所以,对于自身有繁重的数值操作或计算任务的应用程序,Java比起PL/SQL来,是更一般的选择。现在总结一下,通过在服务器里置入Java,Oracle的根本目的不是用Java代替PL/SQL,相反,它在下面四个方面,显著扩充了服务器能够执行的功能种类: 扩展了服务器的SQL(PL/SQL) 类型系统,与Java(以及IDL)类型系统融为一体。 把面向对象的开发技术与存储过程、远程过程调用融为一体。 扩展了能与服务器通信的客户端,除了Net8客户外,还加上了CORBA、EJB以及HTTP/ 浏览器客户(8.1.6版支持)。 (如果用户用Java编写自己的协议驱动程序,Oracle甚至能够支持任何客户端。) 增强了服务器的能力。直接在服务器内执行计算性操作,不必把这些业务逻辑转移给客户或外部过程。 需要着重指出的一点是, PL/SQL和Java在未来的发行版里,都会继续得到增强。二种语言,在功能和性能上,都会增强,也都会在Oracle数据库里扮演重要的角色。案例学习现在,我们已经理解了如何用PL/SQL和Java在Oracle8i 里建立应用程序,现在我们看看最早采用Oracle8i 的三个客户,详细研究他们是如何创建性地运用Oracle8i 提供的特性,扩充他们现有PL/SQL应用程序的功能的。资产管理软件开发商这家软件开发商提供的公司资产管理解决方案,广泛地用于制造业和行销业。他们非常有创造性地把PL/SQL和Java 存储过程组合在一起,从而把原有的应用程序从客户-服务器架构升迁到基于Web的架构。他们已有一个用普通的客户-服务器架构开发的2.0版应用程序。在普通的客户-服务器架构里,应用程序使用Visubal Basic和Powerbuilder的组合客户端,同Oracle7发行版7.3数据库和Oracle8数据库里的PL/SQL存储过程、触发器对话。为了让使用这套资产管理软件的客户能够利用标准的Internet浏览器作为客户端,开发商把现有的应用程序升迁成使用纯HTML的客户端,如下图所示:原来运行在客户端(以Visual Basic或Powerbuilder代码)的所有应用程序逻辑,都从客户端移出,用Java重新编写。起初,Java 程序在应用程序服务器OAS4中运行。由于Oracle8i提供了支持Java的功能,所以开发商获得进一步的灵活性所有“数据密集”型的应用程序逻辑,从应用程序服务器升迁进 Oracle8i 内部。使用新的架构,HTML客户同运行在Oracle 应用程序服务器上的JWeb程序进行通信。Jweb使用Java servlet API,动态地生成HTML页面。然后,JWeb 程序通过集成在OAS里JDBC/Oracle调用接口,与Oracle8i里的Java和PL/SQL存储过程通信。资产管理应用程序以XML文档的方式接收、生成有关不同类型资产的信息。需要注意的是,不必重新编写的PL/SQL逻辑因为原来的通信,就是从Powerbuider客户(通过Oracle调用接口)或从Visual Basic 客户(通过Oracle Objects for OLE)对PL/SQL进行调用。现在,中间层的Java逻辑,可以通过JDBC/Oracle调用接口API调用原有的PL/SQL即使有些Java 商业逻辑移进Oracle8i 服务器之后,也仍然可以通过服务器内嵌的JDBC驱动程序访问原有的PL/SQL。使用PL/SQL存储过程和现在的Java存储过程,公司保护了在编写应用程序逻辑上的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论