Oracle数据库中的Java概述
Java概述
Java 已成为面向对象的编程语言的选择。Java 包括以下特性:
1、Java 虚拟机 (JVM),提供了平台独立性的基础
2、自动化的存储管理技术,例如垃圾回收
3、从 C 语言借鉴的强类型语言语法
Oracle数据库为 Java 程序提供了一个动态的数据处理引擎,支持复杂的查询和数据的多个视图。客户端请求被装配为数据查询,以备立即处理。查询结果是动态生成的。
Java 和 Oracle 数据库的结合优点
1、可创建基于组件的、 以网络为中心的应用程序,并可以轻松地随业务需求的变化而变化。
2、可以将应用程序和数据存储,从桌面移到智能网络和以网络为中心的服务器上。
3、更重要的是,可以从任何客户端设备来访问这些应用程序和数据存储。
下图显示了传统的两层客户端/服务器配置,客户端使用与调用 PL/SQL 子程序相同的方式,来调用 Java 存储过程。

Java 简介
Java 虚拟机 (JVM) 的概述
JVM 是一个运行已编译 Java 代码的虚拟处理器。
Java 源代码被编译为称为字节码的、独立于平台的低级计算机指令。
Java 字节码通过 JVM 解释为平台依赖的操作。
Oracle JVM 概述
Oracle JVM 是一个完整的、符合 Java2 标准的环境,用于运行纯 Java 应用程序。
它与 JLS 和 JVM 规范兼容。
它支持 Java 的标准二进制格式和API。
Oracle 数据库遵从标准的 Java 语言语义,包括在运行时动态加载类。
下图展示了 Oracle Java 应用程序如何位于 Java 核心类库之上,而 Java 核心类库又位于 Oracle JVM 之上。由于 Oracle Java 支持系统位于数据库内部,JVM 与数据库库进行交互,而不是直接与操作系统进行交互。

与其他的 Java 环境不同, Oracle JVM 是内嵌于数据库中的。Oracle JVM 和典型的客户端 JVM 之间存在一些重要的差异。例如,在一个标准的 Java 环境中,通过在命令行上向解释器发出下面的命令来运行 Java 应用程序,其中 classname 是你希望 JVM 首先解释的类名:
java classname
上述命令会使应用程序在你的操作系统中的一个进程中运行。但是,如果不使用命令行界面,则必须将应用程序加载到数据库中,发布接口,然后在数据库数据字典中运行该应用程序。
Oracle JVM 的主要组件
Oracle JVM 通过共享其内存堆,并直接访问其关联数据,与数据库内核运行在同一个进程空间。这种设计优化了内存使用并提高了吞吐量。
Oracle JVM 提供了一个 Java 对象的运行时环境。它完全支持 Java 数据结构、方法调度、 异常处理、和语言级线程。它还支持所有核心 Java 类库,包括 java.lang、 java.io、 java.net、 java.math、和 java.util。
Oracle JVM 在数据库模式中嵌入标准 Java 命名空间。此特性使 Java 程序能够访问整个企业范围内的数据库和应用程序服务器中的 Java 对象。
Oracle JVM 与可扩展的、 共享的数据库内存体系结构紧密集成。
Java 程序有效地使用调用、 会话、和对象生存期,而无需用户干预。这样,Oracle JVM 和中间层 Java 业务对象,即使处于长会话状态,仍然具有可扩展性。
下图显示 Oracle JVM 的主要组件

Java 编程环境
Oracle 为企业应用程序开发人员提供了一个端到端的 Java 解决方案,用于创建、 部署、并管理 Java 应用程序。该解决方案包含客户端和服务器端的编程接口、支持 Java 开发的工具、和与 Oracle 数据库集成的 Java 虚拟机。所有这些产品都与 Java 标准兼容。
Java 编程环境还包括以下额外功能:
1、Java 存储过程类似于 Java,经常和 PL/SQL 配合使用。Java 存储过程与 PL/SQL 紧密集成。可以从 PL/SQL 包调用 Java 存储过程,或从 Java 存储过程调用 PL/SQL 存储过程。
2、用于访问 SQL 数据的 SQLJ 和 JDBC 编程接口。
3、用于辅助开发、 加载、和管理 Java 类的工具和脚本。
Java 存储过程
Java 存储过程是一个发布到 SQL、 并存储在数据库中的 Java 方法。与PL/SQL 子程序类似, Java 存储过程可以从 SQL * Plus 之类的产品直接调用,或从一个触发器间接调用。可以从任何 Oracle Net 客户端访问它——如 OCI、预编译器、或 JDBC 等。
若要发布 Java 方法,需要编写调用规范,以映射 Java 方法名称、参数类型、及其与 SQL 对应的返回类型。当被客户端应用程序调用时, Java 存储过程可以接受参数、 引用 Java 类、并返回 Java 结果值。
应用程序通过引用调用规范的名称来调用 Java 方法。运行时系统在 Oracle 数据字典中查找调用规范的定义,并运行相应的 Java 方法。
此外,可以使用 Java 来开发功能强大的独立于 PL/SQL 的程序。Oracle 数据库提供了一个与 Java 编程语言和 JVM 完全兼容的实现。
Java和PL/SQL集成
可以从 Java 调用现有 PL/SQL 程序,或从 PL/SQL 调用 Java 程序。此解决方案能保护和利用的PL/SQL 和 Java 代码。
Oracle 数据库提供了两种不同的方法从 Java、 JDBC、和 SQLJ 访问 SQL 数据。这两种方法都可用在客户端或服务器上。这样一来,可以将应用程序部署在客户端或服务器上,而无需修改代码。
JDBC 驱动程序
JDBC 是一种数据库访问协议,能够连接到数据库,并对数据库运行SQL 语句和查询。核心 Java 类库仅提供一个 JDBC API, java.sql。但是,JDBC 被设计为允许供应商针对特定数据库提供所需的特殊的驱动程序。Oracle 提供了下表中所示的不同 JDBC 驱动程序。
1、JDBC 瘦驱动程序
可以使用 JDBC 瘦驱动程序来编写纯 Java 应用程序和访问Oracle SQL 数据的小程序。JDBC 瘦驱动程序特别适合基于Web 的应用程序和小程序,因为可以从 Web 页动态地下载它,与下载任何其他 Java 小程序类似。
2、JDBC OCI 驱动程序
JDBC OCI 驱动程序访问特定于 Oracle 的本地代码(即:非Java 的代码)和客户端或中间层上的库,相比 JDBC 瘦驱动程序,提供了性能的提升,其代价是尺寸明显变大,且需要客户端安装。
3、JDBC 服务器端内部驱动程序
当 Java 代码在服务器上运行时,Oracle 数据库使用服务器端内部驱动程序。它允许 Java 应用程序在服务器上的 Oracle JVM 中运行,以访问在本地定义的数据,即与 JDBC 在同一系统上,且在同一进程中的数据。由于具有使用底层的 Oracle RDBMS 库的能力,而没有 Java 代码和 SQL 数据之间网络连接的开销,其性能大大提高。通过在服务器上支持相同的 Java-SQL 接口,Oracle 数据库不需要你重新编码代码来部署它。
SQLJ
SQLJ 是一个用于在 Java 程序中嵌入 SQL 语句的 ANSI 标准。可以在Oracle 数据库的存储过程、 触发器、和方法等环境中使用 SQLJ。此外,可以将 SQLJ 程序和 JDBC 组合使用。
SQLJ 提供了一种简单、但功能强大的方法,来开发 Java 客户端和中间层应用程序,以访问数据库。开发人员将使用 SQLJ 来编写程序,然后使用 SQLJ 翻译器将嵌入式的 SQL 翻译为完全基于 JDBC 的 Java 代码。运行时,程序可以使用标准的 JDBC 驱动程序与各种供应商的数据库进行通信。
简单案例
下面的示例显示了一个简单的 SQLJ 可执行语句:
String name;
#sql { SELECT first_name INTO :name FROM employees WHERE employee_id=112 };
System.out.println("Name is " + name + ", employee number = " + employee_id);
由于 Oracle 数据库提供了一个完整的 Java 环境,不能在客户端上编译将在数据库上运行的 SQLJ 程序。相反,可以直接在服务器上编译它们。
