![]() |
||
约 2 小时 30 分
存储过程允许最充分地利用关系数据库管理系统 (RDBMS) 的功能。存储过程简化了数据库编程,提升了性能,提供了数据逻辑的集中管理,并且优化了网络传输。
将 Java 用于存储过程
Java 语言被设计为一种面向对象的编程语言,它具有内置的安全性机制和高效的垃圾回收系统。Java 还具有一组非常大的、丰富的标准库,从而可以更快、更低成本地开发应用程序。使用 Java 存储过程,开发人员能够在构建数据库应用程序时利用上述所有功能。以下 OBE 基于 Kuassi Mensah 撰写的《Oracle Database Programming using Java and Web Services》一书。本书的说明可从 http://db360.blogspot.com/2006/08/oracle-database-programming-using-java_01.html 处获得,代码示例可从 OTN 上的 http://www-content.oracle.com/webfolder/technetwork/tutorials/obe/db/11g/r2/prod/appdev/javajdbc/files/Code_depot.zip 处获得。
通过以下步骤,使用默认的服务器端连接 (conn = DriverManager.getConnection("jdbc:default:connection:");) 将 TrimLoad.java 例程加载到数据库中,然后通过从 PL/SQL TrimLobProc 过程中调用该例程来执行它:
. |
打开一个终端窗口,切换到 wkdir 目录。执行以下命令将 TrimLob java 例程加载到数据库中 cd wkdir
|
|---|---|
. |
启动 SQL*Plus,以 hr/hr 身份连接。要验证 TrimLob java 例程是否加载到数据库,执行以下语句: set heading off
|
. |
执行以下命令创建一个表(如果之前已经存在表,则删除它)。存储的 TrimLob java 例程使用该表操作 LOB 数据: drop table basic_lob_table;
|
. |
通过创建引用 Java 类方法的 TrimLobProc PL/SQL 调用规范发布 Java 类方法。在 TrimLobProc PL/SQL 规范内部,指定 Java 类方法的名称及其参数。这一过程被称为“发布” Java 类方法。 create or replace procedure TrimLobProcas language java name 'TrimLob.main(java.lang.String[])'; /
|
. |
使用以下命令执行 TrimLobProc 过程: set serveroutput on
|
由于 SQL 中的数据类型和 Java 编程语言中的数据类型不同,因此映射数据类型可以使数据在一个使用 Java 类型的应用程序和一个使用 SQL 类型的数据库之间传输。使用以下步骤在不同的 SQL 类型和对应的 Java 类型之间进行映射:
. |
执行 TypesTab.sql 和 orasqlCHAR.sql 脚本。TypesTab.sql 脚本创建一个容纳几种不同 Oracle 数据类型的表。orasqlCHAR.sql 脚本创建 oracle.sql.CHAR 数据类型到 SQL CHAR 数据类型之间的映射。 set echo on
|
|---|---|
. |
查看 XobTypesTab.sql 脚本。您需要具有 CREATE DIRECTORY 权限才能完成该步骤。按照脚本中的说明。将脚本中的语句复制并粘贴到您的 SQL*Plus 会话中。确保您的目录结构对您的设置是有效的。
通过执行 ClobMap.sql 脚本在 CLOB 定位器和 java.sql.Clob 之间进行映射: @ClobMap
|
. |
查看 ResultSet.sql 脚本。 运行 ResultSet.sql 脚本将 REF Cursor 映射到 java.sql.ResultSet。 @ResultSet
|
. |
执行 XVARRAY.sql 脚本创建一个表,并用各种 VARRAY 列类型填充该表。 @XVARRAY
|
. |
执行 NumVarray.sql 脚本将 VARRAY 映射到 SQL 标量类型 Number。 @NumVarray
|
执行以下步骤,使用 ojmjava 或 PL/SQL 包装调用 Java 应用程序:
. |
执行 Workers.sql 脚本创建并填充 WORKERS 表。 @Workers
执行 Workers.java 脚本,在数据库中创建并存储 Workers java 类方法。 @Workers.java
|
|---|---|
. |
使用 ojmjava 在数据库中调用 Java,这是一个交互式命令行实用程序,可以从客户端计算机在数据库中运行 Java 类。ojmjava 使用 JDBC 连接创建一个数据库会话,将一个字节数组从 ojmjava 客户端传递到执行用户类的 main 方法的 ojmjava 服务器。ojmjava 服务器然后将输出传递回客户端。 退出 SQL*Plus,在终端窗口执行以下命令: exit
通过在命令提示符下键入 exit 退出 OJVMJAVA 实用程序。 exit
|
. |
您也可以通过 SQL*Plus 会话使用 PL/SQL 包装在数据库中调用 Java,PL/SQL 包装可以识别 Java 类及其参数。在终端窗口启动 SQL*Plus,然后使用下面所示的代码创建 PL/SQL 包装: sqlplus hr/hr
|
对象类型调用规范可以使用 STATIC 关键字发布一个对象类型的 public static 成员方法。然而,与任何其他 PL/SQL 打包的调用规范不同,使用 MEMBER 关键字,对象类型调用规范还可以发布非静态实例方法。使用以下步骤创建并测试一个对象类型调用规范:
. |
使用 PL/SQL 包装在数据库中调用 Java。 在 SQL*plus 中,执行 BasicObjTyp.sql 脚本: set echo on
|
|---|
使用二进制可执行文件,您可以获得 Java 的最佳执行性能,这些二进制文件是使用 JIT 编译器和/或静态编译器编译 Java 源代码获得的。从 Oracle Database 11g 开始,OJVM 使用一个允许动态选择、本地编译和执行大多数常用 Java 方法的 JIT 编译器,因此与 Oracle Database 10g 中使用的 NCOMP 相比,可获得更好的性能和可管理性。您可以使用以下步骤显示 JIT 编译与 Java 应用程序的解释对比的优势:
. |
在 SQL*Plus 会话中执行 JITDemo.sql 脚本: @JITDemo 注意解释的和编译的代码之间的计时率
|
|---|
在 OracleJVM 中,用于特定需求的 Java 对象的状态保留在各种称为“对象内存”的特定内存区域中(如 Newspace、Oldspace、Runspace、Stackspace、Sessionspace)。执行以下步骤显示各种 Java 内存区域
. |
在 SQL*Plus 会话中执行 memtest.sql 脚本: @memtest
|
|---|
JMX(Java 管理扩展)是一种 Java 技术,它提供了用于管理和监视应用程序、系统对象、设备、面向服务的网络和 JVM(Java 虚拟机)的工具。
使用 JMX 之前需要对数据库进行配置。执行以下步骤:
. |
打开一个终端窗口,切换到 $ORACLE_HOME/javavm/demo/jmx 目录 cd $ORACLE_HOME
|
|---|---|
. |
输入以下命令: make clobber
|
. |
输入以下命令: make 该脚本创建一个演示用户 jmxdemo,并将 connect、resource 和 jmxserver 授予 jmxdemo。
接下来,该脚本编译并加载相关的 Java 代码,创建与演示的 java 代码对应的 PLSQL 包装
|
. |
完成此命令可能需要一些时间。一旦该脚本结束,按 Enter 键返回到提示符。
|
. |
连接到 jmxdemo 用户
|
. |
要启动 JMX,输入以下命令: @jmxload 9999
|
您可以使用 JConsole(Sun 提供的一个 JMX 客户端工具)监视和控制 Oracle JVM。要使用 JConsole 监视 Oracle JVM,执行以下步骤:
. |
在计算机上,转到 jdk*/bin 文件夹,打开 jconsole。
|
|---|---|
. |
输入服务器的主机名或 IP。在本演示中,已经输入了 localhost 作为要监视的计算机。输入 9999 作为端口。单击 Connect。
|
. |
单击 Overview 选项卡。该选项卡显示 Oracle JVM 的汇总信息和 JMX 监视的值。
|
. |
您可以使用 JConsole 界面的 Memory 选项卡监视内存使用情况。该选项卡提供了内存使用和内存池的有关信息。
|
. |
您可以使用 JConsole 界面的 Threads 选项卡监视线程使用情况。
|
. |
您可以使用 JConsole 界面的 Classes 选项卡监视类加载。
|
. |
您可以使用 MBeans 选项卡监视和管理 MBean。该选项卡显示了该平台 MBean 服务器中注册的所有 MBean 的信息。
|
. |
您可以使用 JConsole 界面的 VM Summary 选项卡查看 VM 信息。
|
DCN 是什么?
数据库更改通知 (DCN) 是这样一个系统:客户端在其中注册感兴趣的某些数据库的查询结果。当与这些查询相关联的对象发生更改时,数据库服务器会通知客户端。使用 JDBC 驱动程序的 DCN 特性,多层系统可以通过接收来自 JDBC 驱动程序的无效事件来尽可能地保持数据缓存是最新的。要执行 DCN,您需要执行以下步骤:
创建一个注册
为了使用 DCN,首先需要创建一个注册。可以使用 oracle.jdbc.OracleConnection 接口的 registerDatabaseChangeNotification() 方法创建一个 JDBC 样式的注册。要激活查询更改通知而非对象更改通知,可以将选项 OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION 设为“true”。使用该选项意味着当您注册一个 SELECT 语句查询时,您注册的是查询的实际结果,而非该查询所基于的数据库对象。查询注册提供比您注册表时更高的粒度。DatabaseChangeRegistration dcr = null;
Properties prop = new Properties();
prop.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION,"true");
try
{
dcr = conn.registerDatabaseChangeNotification(prop);
...将查询与注册相关联
创建了一个注册之后,您可以将一个查询与之相关联。您可以使用 Statement 类方法 setDatabaseChangeRegistration() 将一个查询与注册相关联。该方法将 DatabaseChangeRegistration 的一个对象作为参数。在该演示中,您将 select salary from employees where employee_id=108 查询关联到该注册。Statement stmt = conn.createStatement();
String query = "select salary from employees where employee_id=108";
((OracleStatement)stmt).setDatabaseChangeRegistration(dcr);通知数据库更改事件
您需要使用 addListener() 方法将一个监听程序附加到该注册上,以接收数据库更改通知。DCNListener list = new DCNListener();
dcr.addListener(list);QCNSlider.java 程序创建了一个具有两个滑块的 GUI。当上面的滑块移动到一个 DML 操作时,执行 update employees set salary=? where employee_id =108,。发生数据库更改事件时,数据库服务器会通知 JDBC 驱动程序。然后,该驱动程序构建一个新的 Java 事件,识别要通知的注册并通知附加到该注册的监听程序。QCNSlider 通过根据 employee_id=108 的工资相应地移动底部的进度条来处理该更改事件。
要执行 QCNSlider.java,您需要执行以下步骤来建立环境:
. |
您需要赋予 hr 用户 change notification 权限。打开一个终端窗口,执行以下命令:(注意:您可能还需要解除对 HR 帐户的锁定。) sqlplus / as sysdba
|
|---|
您需要在 JDeveloper 中设置项目属性。执行以下步骤:
. |
打开一个终端窗口,执行以下命令: cd <jdevhome>/jdev/bin
|
|---|---|
. |
出现 Select Role 窗口后,单击 OK。
|
. |
选择 Application> Default Project Properties。
|
. |
单击 Libraries and Classpath
|
. |
单击 Add JAR/ Directory
|
. |
在 $ORACLE_HOME/jdbc/lib 文件夹中选择 ojdbc6.jar,然后单击 Select。
|
. |
单击 OK。
|
执行 QCNSlider.java 之前,您需要使用以下步骤将它添加到一个 JDeveloper 项目中:
. |
在 Application Navigator 中,单击 New Application。
|
|---|---|
. |
为 Application Name 输入 myApp,然后单击 Next。
|
. |
为 Project Name 输入 myProj,然后单击 Finish。
|
. |
选择 File > Open。
|
. |
从 /home/jdbchol 目录中选择 QCNSlider.java 文件,然后单击 Open。
|
. |
右键单击 QCNSlider.java 选项卡,然后选择 Add to myProj.jpr。
|
. |
接受默认选项,然后单击 OK。
|
. |
在 QCNSlider.java 文件中向下滚动一点儿,查看连接信息。
|
|---|
使用以下设置步骤执行 QCNSlider.java:
. |
展开 myProj > Application Sources。右键单击 QCNSlider.java,然后单击 Make。
|
|---|---|
. |
QCNSlider.java 文件成功编译。
|
. |
打开一个终端窗口,执行以下命令: sqlplus hr/hr
|
. |
右键单击 QCNSlider.java,然后单击 Run。
|
. |
您将看到以下输出
|
. |
移动滑块,使左下方的值更改为 62。
|
. |
重新执行以下查询: select salary from employees where employee_id=108; 您会看到工资现在更改为 62。
|
. |
通过执行以下命令将 employee_id=108 的工资更新为 20: update employees set salary=20 where employee_id=108;commit; 您会看到标记为 receiver 的进度条中的变化。
|
. |
查询通知不仅绑定到 where 子句 employee_id=108,还绑定到逻辑上影响同一行的所有更新。执行以下命令: update employees set salary=80 where last_name='Greenberg';commit; 更新 last_name='Greenberg'(它是 employee_id=108)将发送通知,窗口中的进度条将发生滑动。
|
. |
然而,更新 last_name='Ernst' 不会影响 employee_id=108,因此不会发送任何通知,进度条保持不变。执行以下命令: update employees set salary=40 where last_name='Ernst';
|
. |
关闭该项目。单击 File > Close All。
|
. |
单击 File > Close。
|
. |
单击 OK。
|
您需要在 JDeveloper 中设置项目属性。执行以下步骤:
. |
选择 Application> Default Project Properties。
|
|---|---|
. |
单击 Libraries and Classpath
|
. |
单击 Add JAR/ Directory
|
. |
在 $ORACLE_HOME/ucp/lib 文件夹中选择 ucp.jar 文件,然后单击 Select。
|
. |
单击 OK。
|
该演示程序是一个股票报价应用程序,它使用通用连接池从数据库中检索股票价格信息。使用该演示程序,您可以查看通用连接池的属性,无需停止池实例即可在运行时更改这些属性,还可以查看通用连接统计信息等。 要运行该演示程序,执行以下步骤:
. |
单击 Application > New。
|
|---|---|
. |
为 Application Name 输入 myApp2,然后单击 Next。
|
. |
为 Project Name 输入 Project2,然后单击 Finish。
|
. |
选择 File > Open。
|
. |
从 /home/jdbchol 目录中选择 UCPDemo.java、DBConfig.java、HttpServer.java 和 DbConfig.properties,然后单击 Open。
|
. |
在 DbConfig.properties 文件中,验证有关您的 Oracle 数据库的 URL、用户名和口令信息 DB_USER =hr
注意:DB_URL 字符串应该是单独一行。
|
. |
右键单击 UCPDemo.java 选项卡,然后选择 Add to Project2..jpr。
|
. |
接受默认选项,然后单击 OK。
分别针对 DbConfig.properties、UCPDemo.Java 和 HTTPServer.java 重复第 7 步和第 8 步。
|
. |
右键单击 UCPDemo.java 的内容,然后选择 Make
|
. |
单击 Run > Choose Active Run Configuration > Manage Run Configurations
|
. |
单击 Edit
|
. |
在 Program Arguments 文本框中输入 8081(可以是计算机上的任何空闲端口),然后单击 OK
|
. |
单击 OK
|
. |
右键单击 UCPDemo.java 的内容,然后选择 Run。
|
. |
查看输出。
|
. |
启动后,UCPDemo 需要经几秒钟才能将股票价格数据存储到数据库中,因此请等待“...ready to go!”消息显示在屏幕上。
现在,UCP 演示服务器已经启动和运行,您可以使用了。
|
. |
将以下 URL 输入到 Internet Explorer 或 Firefox 中:http://localhost:8081(http://<计算机地址>:<端口>)
|
. |
在浏览器中观察结果。
|
. |
单击 Show UCP Properties。
|
. |
单击 Get Stock Price from the Database。
|
. |
单击 Show UCP Statistics。
|
. |
单击 Dynamically Reconfigure UCP Properties。
|
. |
要停止该服务,单击 Run > Terminate > Project2.jpr
|
. |
关闭该项目。单击 File > Close All。
|
. |
单击 File > Close。
|
. |
单击 OK。
|
客户端结果缓存特性可以在客户端内存中实现 SQL 查询结果集的客户端缓存。用这种方法,OCI 应用程序可以通过客户端内存利用客户端结果缓存来提高重复查询的响应速度。
. |
单击 Application > New。
|
|---|---|
. |
为 Application Name 输入 myApp3,然后单击 Next。
|
. |
为 Project Name 输入 Project1,然后单击 Finish。
|
. |
选择 File > Open。
|
. |
从 /home/jdbchol 目录中选择 Stage1.java 和 Stage5.java,然后单击 Open。
|
. |
右键单击 Stage1.java 选项卡,然后选择 Add to Project1.jpr。
|
. |
接受默认选项,然后单击 OK。
|
. |
右键单击 Stage1.java 的内容,然后选择 Make
|
. |
右键单击 Stage1.java 的内容,然后选择 Run。
|
. |
查看输出。在不使用缓存的情况下,执行该数据库密集型应用程序需要较长时间。
|
. |
右键单击 Stage5.java 选项卡,然后选择 Add to Project1.jpr。
|
. |
查看以下代码,它们已经添加到 Stage5.java 中以实现客户端结果缓存。 导入 UCP:
启用语句缓存:
通过使用 /*+ result_cache */:
|
. |
右键单击代码并选择 make,然后编译并运行 Stage5.java。
|
. |
查看以下输出。您会看到缓存带来的性能改善。
|
在本教程中,您学习了如何:
致谢
![]()
|
关于 Oracle | |