您的位置:寻梦网首页编程乐园Java天地JDBC用PL/SQL和Java开发Oracle8i 应用程序
Java 天地
用PL/SQL和Java开发Oracle8i 应用程序(4)

作者:翻译:张猛  来源:Java开发者

选择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数据库里扮演重要的角色。

上一页 下一页