使用数据库更改通知

使用数据库更改通知

本教程将向您介绍如何使用 Java 程序 QCNSlider.java 来使用数据库更改通知 (DCN)。

大约 30 分钟

主题

本教程包括下列主题:

将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。 (警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

概述

DCN 是什么?

数据库更改通知 (DCN) 是这样一个系统:客户端在其中注册其感兴趣的某些数据库的查询结果。当与这些查询相关联的对象发生更改时,数据库服务器会通知客户端。使用 JDBC 驱动程序的 DCN 特性,多层系统可以通过接收来自 JDBC 驱动程序的无效事件来尽可能地保持数据缓存是最新的。

要执行 DCN,需要执行以下步骤:

创建注册

为了使用 DCN,首先需要创建一个注册。可以使用 oracle.jdbc.OracleConnection 接口的 registerDatabaseChangeNotification() 方法来创建一个 JDBC 样式的注册。要激活查询更改通知而非对象更改通知,可以将选项 OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION 设为“true”。使用该选项意味着当您注册一个选择查询时,您注册的是查询的实际结果,而非该查询所基于的数据库对象。查询注册提供比您注册表时更高的粒度。

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 的工资相应地移动底部的进度条来处理该更改事件。

返回主题列表

开始本教程之前,您应该:

1.

安装 Oracle 数据库 11g

2.

Sun 下载并安装 JDK 6.0。

3 OTN 下载并安装 JDeveloper。
4

dcn.zip 文件下载并解压缩到您的工作目录中(即 wkdir)

返回主题列表

设置环境

要执行 QCNSlider.java,您需要执行以下步骤来设置环境:

1.

您需要赋予 hr 用户 change notification 权限。打开一个终端窗口,执行以下命令:

sqlplus / as sysdba 
grant change notification to hr;
exit 

返回主题列表

设置 JDeveloper 项目属性

您需要在 JDeveloper 中设置项目属性。执行以下步骤:

1.

打开一个终端窗口,执行以下命令:

cd <jdevhome>/jdev/bin
./jdev

其中, 是安装/解压缩 Jdeveloper 的目录。

注:首次运行 JDeveloper 时,您需要输入 J2SE 安装目录,系统还将询问您是否希望移植现有的应用程序。

2.

打开 JDeveloper。Tip of the Day 窗口出现时,单击 Close

3.

选择 Tools > Manage Libraries

4.

单击 J2SE Definitions 选项卡。

5.

单击 Browse 按钮。

6.

导航到 jdk1.5.0_11/bin 目录,然后单击 Open

7.

将 J2SE Name 更改为 jdk1.5.0_11,然后单击 OK

8.

单击 Yes

9.

选择 Tools > Default Project Properties

10.

单击 Libraries,然后单击 Add JAR/ Directory

11.

按住 Ctrl 键,选择 $ORACLE_HOME/jdbc/lib 文件夹中的所有 jar 文件,然后单击 Select

12.

单击 OK

返回主题列表

执行 QCNSlider.java 之前,您需要使用以下步骤将它添加到一个 JDeveloper 项目:

1.

右键单击 Application,然后选择 New Application

2.

为 Application Name 输入 myApp,然后单击 OK

3.

为 Project Name 输入 myProj,然后单击 OK。

4.

选择 File > Open

5.

/home/oracle/dcn 目录中(或者您解压缩 dcn.zip 的地方)选择 QCNSlider.java 文件,然后单击 Open

6.

右键单击 QCNSlider.java 选项卡,然后选择 Add to myProj.jpr

7.

接受默认选项,然后单击 OK

返回主题列表

查看连接字符串

1.

QCNSlider.java 文件中向下滚动一点儿,查看连接信息。

返回主题列表

使用以下设置步骤执行 QCNSlider.java:

1.

展开 myProj > Application Sources。右键单击 QCNSlider.java,然后单击 Make

1.

QCNSlider.java 文件成功编译。

2.

打开一个终端窗口,执行以下命令:

sqlplus hr/hr
select salary from employees where employee_id=108;

3.

右键单击 QCNSlider.java,然后单击 Run

4.

您将看到以下输出

5.

移动滑块,使左下方的值更改为 62

6.

再次执行以下查询:

select salary from employees where employee_id=108;

注意,工资现在更改为 62。

7.

通过执行以下命令将 employee_id=108 的工资更新为 20:

update employees set salary=20 where employee_id=108;
commit;

您会注意到标记为 receiver 的进度条中的变化。

8.

查询通知不仅绑定到 where 子句 employee_id=108,还绑定到逻辑上影响同一行的所有更新。执行以下命令:

update employees set salary=80 where last_name='Greenberg';
commit; 

更新 last_name='Greenberg'(它是 employee_id=108)将发送通知,窗口中的进度条将发生滑动。

9.

然而,更新 last_name='Ernst' 不会影响 employee_id=108,因此不会发送任何通知,进度条保持不变。执行以下命令:

update employees set salary=40 where last_name='Ernst';
commit; 

返回主题列表

在本教程中,您学习了数据库更改通知以及如何使用它。

返回主题列表

将鼠标置于该图标上可以隐藏所有的屏幕截图。

寄送此页面
Printer View 打印机视图