在Oracle中调用Java

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle中的Java体系结构

目前,使用Java来扩展存储程序是一种很流行的方法。在使用Java类库处理数据的过程中,PL/SQL是必不可少的一环,这是因为PL/SQL 封装了Java类库的数据访问,即任何Java存储对象访问的数据都必须经过PL/SQL。

由于本章的所有内容只被最新的数据库版本所支持,因此它独立于本书的其他章节,以下是本章要介绍的内容:

●Oracle中的Java体系结构

●Oracle JDBC的连接类型

●客户端驱动器(Client-side driver),即JDBC瘦驱动(thin driver)

●Oracle调用接口驱动器,即中间层胖驱动(middle-tier thick driver)

●Oracle 服务器端内部驱动器(Oracle Server-Side Internal Driver),即

服务器级的胖驱动

●在Oracle中创建Java类库

●创建内部服务器的Java函数

●创建内部服务器的Java过程

●创建内部服务器的Java对象

●创建、装载、删除、使用Java类库时的故障诊断

●映射Oracle类型

本章将向您展示一张Oracle中巨大的Java组织结构图,在解释了Java的体系结构之后,您还会看到开发和扩展Java组件的方法。

使用Java扩展的原因:

我们将使用PL/SQL作为存储Java类库和其他PL/SQL存储程序或匿名块程序之间的接口。我们还会映射Oracle和Java之间的本地数据类型和用户自定义数据类型,以便能定义有效接口和支持JSP (Java Server Page,Java服务器页面)。

1 Oracle中的Java体系结构

Oracle 9i和10g版本的数据库为开发服务器端或内部Java程序组件提供了一个健壮的体系结构。Java组件采用OO (Object-Oriented,面向对象)的结构,这样的结构非常适合Oracle的对象-关系模型(Object-Relational model)。组件的体系结构实际上就是一个库栈,它包含:

●操作系统的平台依赖性,例如UNIX、LINUX、Microsoft Windows;

●依赖Oracle数据库的文件和库管理;

●独立于平台的JVM (Java Virtual Machine,Oracle Java虚拟机);

●Java内核类库,兼容不同的平台;

●Oracle支持的Java API (Application Programming Interfaces,应用程序接口),如SQLJ、JDBC和JNDI;

●Oracle的PL/SQL存储对象,为SQL和PL/SQL程序之间提供接口,就像服务器端J ava类库一样。

Oracle和Java库就和普通的文件系统一样来存储和管理应用程序,它们屏蔽了不同操作系统的结构差异和系统限制,从而建立起一个独立于平台的存储、检索和恢复文件的统一处理过程。同时,Java虚拟机为创建有大量文档支持的O O程序提供了一个标准环境。另外,Oracle PL/SQL也为其他PL/SQL存储对象以及SQL访问Java库提供了软件包。

下图5-1给出了Oracle JVM(Java虚拟机)的体系结构。

Oracle JVM使用两种格式的命名空间:长名称和短名称。长名称和Java中类的命名模式是一样的,我们可以用它本来的命名空间来调用存储Java程序。然而,本章中Java示例的名称都是短名称,并且程序也没有放进程序包中。当然,您完全可以将您的Java程序放进程序包中。Java存储代码的命名空间包括了程序包的整个层次。如果命名空间的长度超过30个字符,Oracle在数据字典视图中就使用哈希命名空间。使用DBMS_JAVA包和LONGNAME函数可以获得完整的命名空间,而如果要获取短名称可以使用DBMS_JAVA程序包和SHORTNAME函数。

图5-1 Oracle JVM体系结构

JVM具有自动内存管理的功能,这意味着我们不需要手动分配和释放内存空间。同时,就像PL/SQL一样,Java也是强类型的语言。因此,强类型和垃圾回收器相结合,对内存进行管理,为Java提供了一个简单的、富有弹性的环境,就像PL/SQL的运行时引擎一样。

Java和PL/SQL都是解释语言,因此它们要求JIT(Just-In-Time,即时)编译。Oracle 9i中可以对PL/SQL和Java程序进行本地编译,而这实际上是提前编译了。本地编译将PL/SQL和Java程序的字节代码转换成机器可执行的程序代码。

因为本地编译消除了即时编译的延时,所以提高了执行速度。但不幸的是,它却要花些时间将解释过的程序编译为机器代码。权衡之下,如果您并不经常改变代码,本地编译是一个好的选择。

如下所示,有3种方法可将Oracle的Java文件嵌入到数据库实例中:

(1) 处理过程分两步:(a)使用javac编译Java源文件,产生Java字节码程序。(b)使用Oracle loadjava工具将文件放入数据库实例。

(2) 一步处理即可,使用loadjava工具编译文件,并将编译后的Java类文件放入数据库实例。

(3) 一步处理过程,像处理存储Java类一样使用DDL (Data Definition L anguage,数据定义语言)创建和编译Java源文件。

Oracle 9i R1中的语法分析程序有时会出现问题,并且在Oracle 9i R1中使用DDL命令创建Java程序可能会失败。在9i R2以及以后的版本中这些问题都得到了解决。本章所有的示例都将编译并通过使用loadjava工具载入数据库实例中。

小提示:

如果选择使用上面的第二种方法,那么在我们试图重写文件时,可能会产生ORA-2953 3错误,这是因为在一些数据库版本中并不支持loadjava工具的替换(replace)选项。要解决这个问题,您只需要使用dropjava工具并附带–user选项删除.class文件,然后重新运行loadjava工具载入文件即可。

本章假设您对Java有一个基本的了解,即能够编译和运行Java程序。本章所有的示例都提供了实例命令行说明。在附录D中有关于这方面的内容的一个基本指南,并且提供了Java环境配置说明。

Java的存储程序体和传统的PL/SQL程序体很像,由单个会话使用定义者权限或调用者权限访问模式调用它们。但Java在Oracle数据库实例的内部和外部的工作方式有一些不同之处,这些不同之处如下所示:

●首先是执行的控制有明显的不同,Oracle实例外部的Java应用程序包含main()方法,并通过调用它来运行程序,而在实例内部的Java程序则没有包含main()方法。在Oracle实例中存储的Java程序有两种类型的行为,它们是:

●第1种Java程序的功能相当于具有函数和过程的包,它是一些不可实

例化的类。这就要求程序中的所有变量和方法必须是静态的,即将它们作为

类的方法。作为具有函数和过程的PL/SQL 包的镜像,这限制了它们的范围。

为了更易于访问外部Java程序,这种程序代码的语法有所改变。

●第2种Java程序的功能相当于对象类型体的实现,它们是一些可以实

例化的类,并且程序中的变量和方法可以是静态的,也可以是非静态的。但

与外部Java类不同的是,它们的构造函数不能被重载,即它们只有一个默认

的构造函数。JDBC2 API中的SQLData接口用于实例化这种类型的程序,并

且实例化还包含了在PL/SQL和Java间映射数据类型。

相关文档
最新文档