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存储程序或匿名块程序之间的接口。我们还会映射OracleJava之间的本地数据类型和用户自定义数据类型,以便能定义有效接口和支持JSP (Java Server PageJava服务器页面)
1  Oracle中的Java体系结构
Oracle 9i10g版本的数据库为开发服务器端或内部Java程序组件提供了一个健壮的体系结构。Java组件采用OO (Object-Oriented,面向对象)的结构,这样的结构非常适合Oracle的对象-关系模型(Object-Relational model)。组件的体系结构实际上就是一个库栈,它包含:
●      操作系统的平台依赖性,例如UNIX LINUX Microsoft Windows
●      依赖Oracle数据库的文件和库管理;
●      独立于平台的JVM (Java Virtual MachineOracle Java虚拟机)
●      Java内核类库,兼容不同的平台;
●      Oracle支持的Java API (Application Programming Interfaces,应用程序接口),如SQLJJDBCJNDI
●      OraclePL/SQL存储对象,为SQLPL/SQL程序之间提供接口,就像服务器端java创建文件Java类库一样。
OracleJava库就和普通的文件系统一样来存储和管理应用程序,它们屏蔽了不同操作系统
的结构差异和系统限制,从而建立起一个独立于平台的存储、检索和恢复文件的统一处理过程。同时,Java虚拟机为创建有大量文档支持的OO程序提供了一个标准环境。另外,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的运行时引擎一样。
JavaPL/SQL都是解释语言,因此它们要求JIT(Just-In-Time,即时)编译。Oracle 9i中可以对PL/SQLJava程序进行本地编译,而这实际上是提前编译了。本地编译将PL/SQLJava程序的字节代码转换成机器可执行的程序代码。
因为本地编译消除了即时编译的延时,所以提高了执行速度。但不幸的是,它却要花些时间将解释过的程序编译为机器代码。权衡之下,如果您并不经常改变代码,本地编译是一个好的选择。
如下所示,有3种方法可将OracleJava文件嵌入到数据库实例中:
(1) 处理过程分两步:(a)使用javac编译Java源文件,产生Java字节码程序。(b)使用Oracle loadjava工具将文件放入数据库实例。
(2) 一步处理即可,使用loadjava工具编译文件,并将编译后的Java类文件放入数据库实例。
(3) 一步处理过程,像处理存储Java类一样使用DDL (Data Definition Language,数据定义语言)创建和编译Java源文件。
Oracle 9i R1中的语法分析程序有时会出现问题,并且在Oracle 9i R1中使用DDL命令创建Java程序可能会失败。在9i R2以及以后的版本中这些问题都得到了解决。本章所有的示例都将编译并通过使用loadjava工具载入数据库实例中。
小提示:
如果选择使用上面的第二种方法,那么在我们试图重写文件时,可能会产生ORA-29533错误,这是因为在一些数据库版本中并不支持loadjava工具的替换(replace)选项。要解决这个问题,您只需要使用dropjava工具并附带–user选项删除<file_name>.class文件,然后重新运行loadjava工具载入文件即可。
本章假设您对Java有一个基本的了解,即能够编译和运行Java程序。本章所有的示例都提供了实例命令行说明。在附录D中有关于这方面的内容的一个基本指南,并且提供了Java环境
配置说明。
Java的存储程序体和传统的PL/SQL程序体很像,由单个会话使用定义者权限或调用者权限访问模式调用它们。但JavaOracle数据库实例的内部和外部的工作方式有一些不同之处,这些不同之处如下所示:
●      首先是执行的控制有明显的不同,Oracle实例外部的Java应用程序包含main()方法,并通过调用它来运行程序,而在实例内部的Java程序则没有包含main()方法。在Oracle实例中存储的Java程序有两种类型的行为,它们是:
  ●    1Java程序的功能相当于具有函数和过程的包,它是一些不可实例化的类。这就要求程序中的所有变量和方法必须是静态的,即将它们作为类的方法。作为具有函数和过程的PL/SQL 包的镜像,这限制了它们的范围。为了更易于访问外部Java程序,这种程序代码的语法有所改变。
  ●    2Java程序的功能相当于对象类型体的实现,它们是一些可以实例化的类,并且程序中的变量和方法可以是静态的,也可以是非静态的。但与外部Java类不同的是,它们的构
造函数不能被重载,即它们只有一个默认的构造函数。JDBC2 API中的SQLData接口用于实例化这种类型的程序,并且实例化还包含了在PL/SQLJava间映射数据类型。
●      Java类以Java字节码的形式保存在一个空文本中,并压缩为Oracle数据库实例的外部Java档案文件。Oracle把它们作为源、类以及Java对象资源来管理。模式中包含一个JAVA$OPTIONS表,它可被DBMS_JAVA包、SET_COMPILER_OPTIONRESET_COMPILER_OPTION过程或GET_COMPILER_OPTION函数访问和配置。
●      内部Java类文件并不支持用户接口,这意味着它们不能被直接输出到控制台或本地声音设备。声音文件可以在Oracle内部处理,但它们不能访问本地声音设备。与Oracle 9i相比,Oracle 10g稍微有些改变,因为它使用的是Java SDK 1.4.x,支持Headless(无头) AWT
●      Oracle内部的Java类的名称有两种格式。一种是支持标准模式数据库对象的短格式,它最长可以有30个字符。当一个类的名称超过长度限制时,Oracle将自动创建一个哈希名称作为类的短名称,并将长名称存放在别处。
●      Oracle内部Java类不支持标准JavaClass.forName()方法。但Oracle 9iOracle10g
持使用多个分解器来定位类。若使用其中一个来定位类,结果却是运行另一个分解器,我们就会得到意料之外的结果。
●      操作资源是受严格限制的,您必须拥有SYSDBA用户权限才能变更它们。可以使用DBMS_JAVA包和GRANT_PERMISSION过程像IO文件来一样打开操作资源。
●      Java线程针对Oracle内部的Java类工作方式与外部类有所不同。Oracle JVM使用的是非抢占的线程模式。这意味着所有的线程运行在一个单一的操作系统线程中,Oracle JVM仅是在线程之间切换上下文。切换上下文的意思是,Oracle JVM以循环的方式在每一个时间段产生一个线程,直至所有线程结束。
注意:
正在使用Oracle版本会告诉您应该使用哪个版本的JDK(Java Software Development KitJava软件开发包)。为简单起见,本章所有的示例都是使用Oracle 9i支持的Java SDK 1.3开发的。同时,它们也被Java SDK 1.4所支持。
Oracle Java开发人员向导列出了两个关键的错误代码,但其实还存在很多其他的错误代码。
在这我们并不想列出这些错误代码,而是将它们放在在本章后面的创建、装载、删除、使用Java类库时的故障诊断一节介绍。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。