使用pureQuery优化现有的JDBC应用程序

开始之前

pureQuery 简介

IBM Data Studio 产品组合中包括 pureQuery,它是一个高性能数据访问平台 ,旨在简化 Java 数据访问的开发、管理、安全保障和优化。它由开发工具(在 Data Studio Developer 中)、一个简单直观的 API 和一个运行时(在 Data Studio purequery Runtime 中)组成。

在优化 DB2 数据的 Java 数据访问和保障访问的安全方面,pureQuery 的主 要优点是开发和部署使用静态 SQL 的应用程序非常容易。当使用静态 SQL 时, 执行 SQL 语句的准备步骤是在应用程序执行之前就进行的,因此可在运行时取得 更好的性能。此外,静态 SQL 总是可以预先知道,因此不会受到恶意的或意外的 SQL 注入的影响,而这正是动态 SQL 的安全缺陷。

以前,为了使用静态 SQL,需要用 pureQuery 带注释的方法样式来编写应用 程序。在 1.2 版的 Data Studio Developer 和 Data Studio pureQuery Runtime 中,无论现有的 JDBC 应用程序是直接实现持久性,还是使用流行的框 架(比如 Hibernate 和 JPA 来实现持久性),都可以使用静态 SQL,而不必重 新编写代码。这个特性有时候被称作客户机优化(client optimization),因为 启用静态 SQL 的过程是在 JDBC 客户机这一级发生的。我们将此特性称作 pureQuery for JDBC applications。

启用应用程序的 pureQuery for JDBC applications 特性的常规过程是一个 迭代的过程,由以下几个阶段组成:

计划。计划阶段的目的是确定应用程序是否适合使用 pureQuery。虽然从概念 上讲可以为任何访问任意 DB2 数据服务器中的数据的 Java 应用程序启用该特性 ,但是应用程序必须满足一定的标准,例如先决条件(比如,应用程序在 JRE 1.5 或以上中运行)、安全方面(比如,DBA 或数据管理员同意使用基于数据库 包的安全性,而不是基于表/视图的安全性)等等。

捕捉。PureQuery for JDBC applications 静态地处理 SQL 语句时,依赖于 关于应用程序 SQL 语句及其相关元数据的信息。捕捉阶段收集必要的信息,并将 其存储在一个元数据文件中。

配置。为了静态地执行 SQL,首先必须将它绑定到一个数据库包。在此之前, 可以配置已捕捉的 SQL 文件,以指定一些设置,例如每个包中存放多少条 SQL 语句。

绑定。定义包的特征之后,需要将捕捉的 SQL 和相关的元数据绑定到一个或 多个数据库(也可以将它存储到 DBRM 中,以后再部署它)。

执行和验证。成功地完成上述阶段后,pureQuery for JDBC applications 就 配置好了,这就可以静态地执行 SQL 语句了。在验证过程中,质量保证专家验证 应用程序是否按预期执行,并返回预期的结果。

注意:在通常的使用场景中,启用(enablement)过程是一个迭代的过程。

关于本教程

在本教程中,学习如何使用 Data Studio Developer,让一个简单的定制开发 的 JDBC 应用程序可以使用 pureQuery for JDBC applications 特性。不过,您 也可以使用自己选择的访问任意平台上的 DB2 数据的应用程序来学习本教程。客 户机优化不需要访问源代码,但是本教程中的步骤假设您有那样的访问权。

目标

本教程的目标是介绍使现有的 JDBC 应用程序支持 pureQuery 的步骤。为了 使本教程简单一些,我们提供了一个小型的应用程序,这个应用程序直接使用 JDBC 实现持久性,它满足启用 pureQuery 所需的所有要求,并且很容易验证。

在本教程中,您将学习如何:

创建一个示例数据库,并将示例 JDBC 应用程序导入到 Data Studio Developer 1.2 中。

使用一个代码路径运行应用程序,并捕捉它的 SQL。

在 Java 源代码中查看示例应用程序的 SQL 和它与 Java 源代码的关系(可 选)。

配置捕捉到的 SQL,并将其绑定到一个数据库包。

以静态 SQL 执行模式运行示例应用程序,并验证它是否具有正确的行为。

使用另一条代码路径运行应用程序,以捕捉剩下的 SQL;然后,使用静态 SQL 执行重新绑定并重新运行应用程序。

先决条件

本教程是为拥有基于 Eclipse 的工具方面的基本经验的应用程序开发人员和 DBA 编写的。

系统需求

为了运行本教程中的例子,需要安装 Data Studio Developer 1.2。另外还需 要对 DB2 数据服务器的访问权。

创建示例数据库,并导入示例 JDBC 应用程序

创建示例数据库

示例应用程序将从一组数据库表中检索数据。请遵循下面的步骤,在一个名为 GS_DB 的数据库中创建并填充这些表。

确保 DB2 Express-C 9(或任何其他受支持的 DB2 数据服务器)已经安装, 并且正在运行。

打开一个 DB2 Command Window。从开始菜单中选择 Programs > IBM DB2 > DB2COPY1 > Command Line Tools > Command Window。

将附带的数据库设置脚本 DB_Script.sql 复制到一个目录中。

确保 Command Window 正指向保存 DB_Script.sql 的路径;如果没有,则更 改到该路径。

输入以下命令运行数据库设置脚本:db2 -tf DB_Script.sql

将示例应用程序导入到 Data Studio Developer

将附带的 zip 文件 ClientOptimizationProject.zip 复制到一个目录。

启动 Data Studio Developer 1.2。

看到提示时,输入任意工作区名称。

切换到 Java 透视图(图 1 显示了如何找到这个透视图)。

图 1. 查找当前活动的透视图

为了切换透视图,选择 Window > Open Perspective > Java。

图 2. 切换到 Java 透视图

选择 Window > Show View > Other… > Data,打开 Database Explorer 和 pureQuery Outline 视图。

图 3. 将 Database Explorer 和 pureQuery Outline 视图添加到当前透视图 中

选择 File > New > Project… > Java > Java Project,然后 单击 Next,创建一个新的 Java 项目,如图 4 所示。

图 4. 创建新的 Java 目录

将项目命名为 ClientOptimization,并对它进行配置,如图 5 所示。在 Contents 下,选择 Create new project in workspace,对于 JRE,选择 Use default JRE (Currently ‘jdk’)。在 Project layout 下,选择 Create separate source and output folders,并单击 Finish 保存配置更改。

图 5. 配置 Java 项目

选择前面下载到本地计算机的 zip 文件。选择文件夹 .classpath 和 .project 来完成向导。在 “Into folder” 域中,选择 ClientOptimization, 然后勾选 Overwrite existing resources without warning。最后单击 Finish ,以便将例子源代码导入到当前项目中。图 7 显示了这些步骤。

图 7. 导入示例项目

在 Package Explorer 中,展开 ClientOptimization 项目。如图 8 所示, source 文件夹包含一个名为 BasicJDBCApp 的 com.ibm.co.test 包中的 Java 类。这个示例应用程序有两个执行路径(runCodePath1() 和 runCodePath2()) ,它们将根据可选的 4 个命令行参数有条件地执行:

参数 1(必需):标识示例数据库的 JDBC URL

参数 2(必需):应用程序用于连接到示例数据库的 DB2 用户 ID

参数 3(必需):以上用户 ID 的密码

参数 4(可选):标识要执行的代码路径;1 表示代码路径 1,2 表示代码路 径 2,没有值则表示同时执行这两个路径

图 8. Package Explorer 中显示的导入的 Java 项目

为示例数据库注册新的连接

对于本教程中的一些任务,需要到 GS_DB 示例数据库的一个连接。注意,示 例应用程序本身使用一个单独的数据库连接,这个连接独立于在准备步骤中建立 的连接。

在 Database Explorer 视图上,右键单击 Connections 并选择 New Connection…

图 9. 在 Data Studio Developer 中创建新的数据库连接

完成数据库连接向导,创建到 GS_DB 数据库的一个新连接,如图 10 所示:

输入 GS_DB 作为连接名称和数据库名称。

对于主机名,如果 DB2 在本地计算机上运行,则输入 localhost,否则输入 适当的主机名。

对于端口号,如果在安装期间将 DB2 配置为使用默认的端口号,则输入 50000,否则输入适当的端口号。

输入有效的 DB2 用户凭证,并单击 Test Connection 验证 Data Studio Developer 是否能访问例子数据库。

单击 Finish。

图 10. 创建新的数据库连接

恭喜,您已经完成了设置过程。现在可以进入下一步 — 为项目启用 pureQuery 并捕捉应用程序的 SQL。

捕捉应用程序的 SQL

要利用 pureQuery for JDBC applications,必须首先在应用程序运行时捕捉 应用程序的 SQL 语句。如图 11 所示,捕捉过程还获取相关联的元数据,例如输 入和输出参数特征。对于后面创建支这些 SQL 语句的静态执行的数据库包的步骤 ,这里捕捉的信息是必需的。在本教程的后面,您还将看到这些捕捉到的信息如 何使工具中独特的功能查看 Java-SQL 关系。

图 11. PureQuery 捕捉模式概览

只要应用程序环境被配置为使用适当级别的包含扩展的 pureQuery 功能的 DB2 或 Informix Dynamic Server(IDS)驱动程序,就可以从任何 Java 应用程 序捕捉 SQL。

Data Studio Developer 附带了一组适当的数据服务器驱动程序,完成本教程 需要用到这些驱动程序。要访问这些驱动程序,首先必须将 pureQuery 支持添加 到 ClientOptimization 项目中。

将 pureQuery 支持添加到示例项目中

默认情况下,Java 项目不支持 pureQuery 特性。请遵从以下步骤启用那些特 性,并将 DB2 Java Common Client(JCC)驱动程序和 pureQuery Runtime 库复 制到示例项目中。

在 Package Explorer 中,右键单击 ClientOptimization 项目,选择 pureQuery > Add pureQuery Support…

图 12. 添加 pureQuery 支持

为了将示例数据库与当前项目相关联,选择用于 GS_DB 的数据库连接,并单 击 Next,如图 13 所示。

图 13. 将项目与一个数据库连接相关联

如图 14 所示,勾选 Enable SQL capturing and binding for JDBC applications 选项,并单击 Finish。

图 14. 启用 SQL 捕捉和绑定

按 F5 刷新 Package Explorer 视图。您将注意到,下面的文件已经被添加到 ClientOptimization 项目中(如图 15 所示):

DB2JccConfiguration.properties:这个属性文件用于配置 JCC 驱动程序的 运行时行为。

pdq.jar 和 pdqmgmt.jar:这些库提供 pureQuery 运行时和工具功能。

db2jcc.jar 和 db2jcc_license_cisuz.jar:这些是 pureQuery 运行时所必 需的专用 JCC 驱动程序库。

pureQueryFolderDefault.genProps:这个属性文件用于配置将在绑定阶段创 建的数据库包的特征。

pureQueryFolderDefault.bindProps:这个属性文件用于配置数据库包绑定选 项。

这些库被自动添加到 classpath,所以只要在 Data Studio Developer 中启 动本教程中的应用程序,该应用程序就可以使用这些库。(后面会更详细地讨论 这些属性文件的作用)。

图 15. 这些文件表明项目已启用 pureQuery

注意:如果要为不在 Data Studio Developer 中运行的应用程序启用 pureQuery for JDBC applications,则需要将必需的 DB2 和 pureQuery 库安装 到本地文件系统中,并将它们添加到 classpath 环境变量。

启用 SQL 语句捕捉功能

如果按以下方式之一指定 pdqProperties 属性,则专用 JCC 驱动程序库以 pureQuery 模式运行:

在 DB2JccConfiguration.properties 文件中

作为运行 JDBC 应用程序的 JVM 的一个参数

作为一个应用服务器,例如 WebSphere Application Server 的一个数据源属 性

作为数据库连接 URL 的一部分

通过使用 java.util.Properties 类作为连接对象的属性

在本教程中,您将使用 DB2JccConfiguration.properties 配置文件,该文件 是在将 pureQuery 支持添加到 ClientOptimization 项目时创建的。

在 Package Explorer 中,双击打开 DB2JccConfiguration.properties 文件 。通过覆盖默认的属性值,可以配置驱动程序的 pureQuery 运行时行为。默认的 属性文件定义 3 个 pureQuery 属性:

captureMode。如果该属性被设置为 ON,则驱动程序捕捉成功执行的 SQL。要 禁用捕捉,可将属性值设为 OFF。

executionMode。该属性定义驱动程序如何执行 SQL 语句:动态(DYNAMIC) 还是静态(STATIC)。如果没有指定,默认值为 DYNAMIC。

pureQueryXml。当 captureMode 属性被设置为 ON 时,驱动程序从一个文件 中读取前面捕捉的 SQL 语句和相关的元数据,并附加在这个 XML 文件的后面。 该属性值表明一个 XML 文件的名称和它在文件系统中的位置,驱动程序使用这个 XML 文件作为读写操作的目标。在捕捉模式中,如果这个文件不存在,则在指定 位置创建它,如果存在,则更新它。

要获得受支持运行时选项的完整列表及其简要描述,可以利用内容辅助特性: 将鼠标定位到行尾,输入一个逗号,并按下 键。 图 16 显示了这个步骤。

图 16. 使用内容辅助修改驱动程序属性

放弃之前可能对配置文件做过的更改。配置文件已经定义了捕捉示例应用程序 的 SQL 语句所需的属性。

注意:若要为不在 Data Studio Developer 中运行的 JDBC 应用程序启用 pureQuery 捕捉模式,可以使用前面提到的几个方法之一。例如,要为在一个操 作系统 shell 中运行的应用程序启用捕捉模式,可以以系统属性的形式指定适当 的 pureQuery 属性:

java -Ddb2.jcc.pdqProperties=captureMode(ON),executionMode (DYNAMIC),... package.ClassName

运行示例应用程序以捕捉它的 SQL 语句

利用内建的 Eclipse 特性,可以在 Data Studio Developer 中运行示例应用 程序。如果要这样做,可以按下面的步骤创建一个 “run” 配置:

在 Package Explorer 视图中,展开 ClientOptimization 项目。

展开 src 文件夹,找到 BasicJDBCApp.java 源文件,并右键单击它。

从上下文菜单中,选择 Run As>Run…

右键单击 Java Application,在 Run 向导中选择 New。

图 17. 为示例应用程序创建新的运行配置

如图 18 所示,输入 BasicJDBCApp 作为配置名,ClientOptimization 作为 封装对象,com.ibm.co.test.BasicJDBCApp 作为要执行的类。

图 18. 指定运行配置选项

选择 Arguments 选项卡,指定以下程序参数:

参数 1:标识示例数据库的 JDBC URL

参数 2:应用程序用于连接到示例数据库的 DB2 用户 ID

参数 3:以上用户 ID 的密码

参数 4:标识要执行的代码路径;为了只执行第一条代码路径,指定 1

图 19 显示了一个运行配置的例子。

图 19. 运行配置的示例

在捕捉 SQL 语句时,驱动程序分析语句,如果检测到可能导致语句静态执行 时产生不正确结果的潜在问题,则发出警告消息。默认情况下,这些警告消息不 会显示,因为应用程序可以在任何环境中运行,生成的输出可能不可见。

建议:启用 pureQuery 日志记录被认为是最佳实践,它可以在一个外部文件 中捕捉和查看警告,以确定在执行接下来的步骤之前是否需要做其他事情。

要启用日志记录,可将系统属性 pdq.traceLevel 设置为 FINE,还可以将一 个文件名指定给系统属性 pdq.traceFile。例如,为了启用捕捉示例应用程序的 SQL 时的日志记录,可输入 -Dpdq.traceLevel=FINE 作为 VM 参数,如 图 19 所示。如果没有指定日志文件的名称,在默认使用 pdq.log 作为文件名。

单击 Run 启动应用程序,并捕捉应用程序在执行第一条代码路径时发出的 SQL 语句。(在现实场景中,会对应用程序运行一组测试套件,以确保尽可能多 的 SQL 语句被运行,从而被捕捉)。

可选:浏览捕捉的元数据

在此顺便简要地展示一下,在捕捉到一些 SQL 之后,可以做些什么很棒的事 情。Data Studio Developer 1.2 提供了一个名为 pureQuery Outline 的新视图 ,通过这个视图,应用程序开发人员和 DBA 可以确定检索或操作哪些数据库对象 ,以及该操作是在源代码中的什么地方执行的。有了这样的信息,就可以大大提 高生产率,因为这简化了分析和问题诊断。

要利用 pureQuery outline 视图提供的可视化功能,Java 应用程序必须使用 方法样式的 pureQuery API 作为数据访问层,或者允许使用您已经完成的步骤捕 捉它的 SQL。

在 Package Explorer 中,选择 ClientOptimization 项目,并按 F5 键刷新 显示屏。捕捉过程结束后,现在项目中多了两个文件:捕捉的 SQL 元数据文件 pureQueryFoldercapture.pdqxml 和 pureQuery 日志文件 pdq.log。

图 20. 捕捉 SQL 时创建的文件

打开 pdq.log。如果在捕捉过程中检测到,某个已执行的 SQL 语句静态地执 行时可能导致不正确的结果,那么可以看到相应的警告消息。注意,日志文件中 没有包含任何警告消息,这表明没有检测到潜在的问题。关闭日志文件。

双击 pureQueryFoldercapture.pdqxml,以使用 pureQuery Outline 视图显 示捕捉到的元数据。

定位到 pureQuery Outline 视图。如果该视图中没有显示信息,则单击 refresh outline 图标,如图 21 所示。

图 21. “refresh” 图标

该视图被分成三个选项卡:Database、Java 和 SQL。本教程的这一部分只讨 论前两个选项卡;SQL 选项卡放在下一节的配置阶段时讨论。

选择 Database 选项卡。如图 22 所示,该选项卡显示 Java 应用程序以捕捉 模式执行时访问或修改过的数据库对象的列表。该信息以层次结构的形式显示, 标识数据库对象、创建对象时所在的模式、对对象执行的查询,以及相应的应用 程序栈跟踪。对于每条 SQL 语句,显示一组列,表明哪些数据被访问。

图 22. Database 选项卡

树中显示的每个节点和元素都提供可简化常见开发或维护活动的功能,将 SQL 更紧密地集成到 Java IDE 中。

双击一个模式、表或列节点,以打开 Database Explorer 视图,并查看相应 的属性。(也可以右键单击表名并选择 Show in Database Explorer)。

图 23. 在 Database Explorer 中查看表的属性

双击一条 SQL 语句,以打开源代码(如果它在当前项目中)。光标将定位到 执行该 SQL 语句的那一行,或者,对于批量更新,光标将定位到使用 JDBC 方法 addBatch 添加该 SQL 语句的那一行。(也可以右键单击语句并选择 Show in Source)。

图 24. 查看 SQL 语句在源代码中的位置

右键单击一条 SQL 语句,执行常见的开发或管理任务,例如执行 SQL 语句( 不必编译和运行应用程序)、将 SQL 语句保存到一个文件中(例如,为了创建一 个工作负载)或者启动 Visual Explain 以查看当前访问计划。

图 25. 从 pureQuery outline 中调用 SQL 相关任务

无论是应用程序开发人员还是 DBA,都可以通过使用这个元数据透视图快速地 发现哪些数据库对象受到应用程序的影响,它们是如何被访问或操纵的,以及该 操作在应用程序中的什么地方执行。

Java 选项卡显示相同的信息,但是按 Java 包和类来对信息进行分组,以便 于确定哪些数据库对象被源代码的一个特定层访问或修改。

选择 Java 选项卡。

图 26. 识别被执行的 SQL 语句

右键单击一个类名,并选择 Show in SQL EdiTor…,以保存所有显示的用于 这个类的 SQL 语句。可以使用这个功能来构建一个小型的工作负载,用于模拟用 例或使相关人员(比如 DBA)可以得到应用程序 SQL。

双击一条 SQL 语句,打开源代码(如果它在当前项目中)。光标将被定位到 执行 SQL 语句的那一行上。(也可以右键单击语句并选择 Show in Source)。

双击一个模式、表或列节点,打开 Database Explorer 视图,并查看相应的 属性。(也可以右键单击一个表名并选择 Show in Database Explorer) 。

右键单击一条 SQL 语句,执行常见的开发或管理任务。

选择多条 SQL 语句,并单击右键,将选中的语句导出到一个文件中。

查看显示的 SQL 语句。注意,即使语句在源代码中只出现一次,这里却会显 示重复的语句。这里显示的源代码信息表示栈跟踪元素。因此,对于栈跟踪里的 每个元素,都会列出一条 SQL 语句。例如,在当前应用程序中,第 78 行的 runCodePath1() 方法检索一组产品。而在第 237 行,main(String[] args) 方 法调用了这个方法。(Database 选项卡提供了更直观的栈跟踪元素视图)。

注意:捕捉过程只捕捉惟一的 SQL 语句。如果 SQL 语句的 SQL 文本和相关 元数据(例如输入和输出参数以及它们的特征)相同,则认为是同一条 SQL 语句 。例如,假设一个应用程序在源代码中的两个不同位置从一个 CUSTOMER 表中选 择一个客户 ID:

source code line 305: con.execute("SELECT C_ID FROM CUSTOMER ORDER BY C_ID");            ...source code line 428: con.execute("SELECT C_ID FROM CUSTOMER ORDER BY C_ID");

pureQuery Outline 视图只显示这条 SQL 语句在源代码中的一个地方 — 启 用捕捉时第一次成功执行该语句的那个地方。这一行为并不影响在该 SQL 语句所 有出现的地方静态地执行它。

配置和绑定捕捉的 SQL

配置捕捉的元数据

捕捉的 SQL 语句和它们的相关元数据与数据库包还没有任何关联。因此,必 须定义这些 SQL 语句如何映射到数据库包,如何命名包,以及是否将包版本化。 Data Studio Developer 提供了用于定义那些包的特征的工具。

在 pureQuery Outline 视图中,选择 SQL 选项卡,并展开 DB2 Packages 节 点。这个选项卡中显示的信息使您可以预览要创建的用于容纳捕捉前面的 SQL 语 句的包。

图 27. 使用 pureQuery Outline 视图预览数据库包

第一个子节点表示一个数据库包。默认情况下,通常的包名(Client)是由封 装项目的名称(ClientOptimization)的前 6 个字符得出的。GS_DB 数据库中可 能已经存在具有这个名称的包,也可能没有。为了确定是否已经存在使用那个名 称的包,双击 Client(或右键单击包名并选择 Show in Database Explorer)。 如果已经定义了具有那个名称的数据库包,则 Database Explorer 视图中会显示 它,否则显示一个错误。

展开 Client 节点,它表示一个在 GS_DB 数据库中不存在的数据库包(如果 您第一次实践本教程)。这时会显示一组被捕捉到的 SQL 语句,如果执行绑定操 作,这些 SQL 语句将被存储到这个包中。

向下钻取任意一条 SQL 语句。这时会显示 Java 应用程序栈跟踪和被该语句 访问或修改的一组数据库对象。探索可通过双击或右键单击 SQL 语句、栈跟踪元 素或数据库对象执行的各种不同的任务。

图 28. 在数据库包预览选项卡中浏览与 SQL 语句相关的元数据

要定制数据库包的特征,必须覆盖配置文件 Default.genProps 中的默认设置 。这个配置文件是在为 ClientOptimization 项目启用 pureQuery 时创建的。

在 Package Explorer 中,展开 ClientOptimization 项目,展开 pureQueryFolder 文件夹,双击 Default.genProps,然后在编辑器中打开该文件 。

如果在 pureQuery for JDBC applications 的上下文中,则使用这个文件来 定义一个捕捉文件的以下特征:

在创建另一个包之前,将该文件中最大数量的 SQL 语句(默认为 100;这只 是软限制)分配给一个数据库包

包名的前缀,必要时用它生成一个或多个包名

将在其中创建包的数据库集合 ID(默认为 NULLID)

一个版本号

配置文件编辑器提供了内容辅助功能,可以用它来添加配置选项或者获取关于 可用配置选项的帮助。要调用内容辅助,可将光标定位到行尾(必要时添加一个 空格,以便将这个新选项与已有的选项隔开),并按 键,如图 29 所示。

图 29. 使用内容辅助覆盖包配置的默认设置

将自动生成的数据库包的名称由 Client 改为 REPP。

保存更改。这时会出现一条警告,表明配置属性 已经被更改,需要重新构建项目。

单击 Yes 重新构建项目。

在 Package Explorer 中找到 capture.pdqxml 文件,并双击它,以便在 pureQuery Outline 视图中显示该文件。

单击刷新按钮刷新 pureQuery Outline 视图。

切换到 SQL 选项卡,预览更新后的数据库包特征。包名应该已经从 Client 改为 REPP。

图 30. 预览更新后的包特征

单击包 REPP,并选择 Properties 视图,以确认为这个包指定了正确的集合 ID(NULLID)和版本号(no version)。

关闭数据库包配置文件 Default.genProps。

至此,您已经定义了基本的包特征,现在可以配置绑定选项了。绑定选项定义 static binder 实用程序的行为以及绑定数据库包时使用的选项。与用于配置包 特征的 Default.genProps 文件类似,可以通过修改一个名为 Default.bindProps 的配置文件来覆盖默认的绑定选项。这个配置文件是在为项 目启用 pureQuery 时创建的。

在 Package Explorer 中,展开 ClientOptimization 项目,接着展开 pureQueryFolder 文件夹并双击 Default.bindProps,然后在编辑器中打开该文 件。

将光标定位到最后一行,并输入 defaultOptions=。

调用内容辅助( ),预览可用于 static binder 实用程序的选项。

图 31. 使用内容辅助覆盖 static binder 配置的默认设置

注意,嵌入式上下文帮助还提供了一组数据库包绑定选项(在 -bindOptions 选项之后指定)以及关于它们适用于哪种目标数据库平台的信息。

图 32. 使用内容辅助覆盖绑定选项

由于在本教程中使用默认的绑定选项,因此要放弃可能做出的任何更改,并关 闭 Default.bindProps。

将捕捉的 SQL 绑定到一个数据库包

绑定实用程序分析捕捉的 SQL 语句,并根据前一阶段指定的配置选项创建必 要的数据库包(或 DBRM 文件)。Data Studio Developer 工具可以简化绑定包 的任务:只需选取已捕捉和配置的元数据文件,并选择一个目标数据库。

在 Package Explorer 中,在文件夹 pureQueryFolder 中选择捕捉的元数据 文件 capture.pdqxml。

右键单击 capture.pdqxml 并选择 pureQuery > Bind…。

图 33. 绑定应用程序

这时打开绑定向导,它会提示选择在其中创建包的目标数据库。默认情况下, 选择与当前项目关联的数据库。在开发或测试环境中,如果您的应用程序连接到 的一个或多个开发和测试数据库,您可以在其中创建包。

选择 GS_DB 连接并单击 Finish。完成时,Console 视图中显示以下消息:

图 34. 表明绑定操作成功完成的确认消息

验证这个包是否在目标数据库中。在 pureQuery Outline 视图中,选择 SQL tab 并双击名为 REPP 的 DB2 包,在 Database Explorer 中找到那个包。由于 使用了默认的绑定选项,这个包在 4 个隔离级别(uncommitted read、cursor stability、read stability 和 repeatable read)上绑定。

图 35. 使用 pureQuery Outline 视图在 Database Explorer 中找到数据库 包

确认这个 数据库包包含捕捉到的 SQL 语句。单击 REPP1 包,切换到 Properties 视图。 选择 Statements 选项卡,将其中列出的语句与 pureQuery Outline 视图的 SQL 选项卡中显示的那些语句进行比较。

图 36. 使用 Properties 视图验证数据库包的内容

在绑定操作中,必要的 EXECUTE 包权限已授给您在绑定向导中选择的与数据 库连接关联的用户 ID。如果示例应用程序使用相同的用户 ID 建立数据库连接, 那么可以直接以静态 SQL 执行模式重新运行示例应用程序;否则,先要将必要的 包权限授给适当的用户 ID。

以静态 SQL 执行模式运行 JDBC 应用程序

以静态 SQL 执行模式重新运行示例应用程序

如果没有对环境作任何更改就重新运行应用程序,那么它的 SQL 语句仍然会 动态地执行,因为驱动程序当前被配置为动态地处理 SQL 语句。我们在讨论在 JCC 驱动程序中启用 SQL 捕捉的话题时,介绍了 pdqProperties 属性,该属性 用于定义 SQL 执行模式。如果 executionMode 属性被设置为 STATIC,则驱动程 序将已捕捉和配置的元数据装载到内存中,如果可以找到传入的 SQL 语句的相关 元数据,就会处理这些 SQL 语句。

图 37. pdqProperties 指定驱动程序的运行时行为

将驱动程序配置为静态执行 SQL 语句,并重新运行应用程序代码路径 1。

在 Package Explorer 中,双击 DB2JccConfiguration.properties,在一个 编辑器中打开它。

将 captureMode 属性的值从 ON 改为 OFF,以禁用捕捉。

将 executionMode 属性的值从 DYNAMIC 改为 STATIC。

图 38. 将 SQL 执行模式从动态改为静态

保存更改( ),但是不要关闭编辑器窗口。

在 Package Explorer 中,展开 src 文件夹,找到 BasicJDBCApp.java 源文 件,并右键单击它。

从上下文菜单中,选择 Run As>Java Application,以便使用前面创建的 运行配置重新运行示例应用程序的代码路径 1。

应用程序应该成功地静态执行 SQL 语句,并返回与前面一样的结果。

修改应用程序的运行配置,使之执行代码路径 1 和 2,这将导致更多的 SQL 被处理。

右键单击 BasicJDBCApp.java 并选择 Run As > Run…,将应用程序的运 行配置修改为执行代码路径 1 和 2。

选择 Arguments tab,删除最后一个程序参数(1)。

图 39. 修改运行配置执行两个代码路径

单击 Run。

应用程序应该会顺利执行,不会出现警告或错误。注意,应用程序已经成功地 处理了之前由于当驱动程序处于捕捉模式时从未运行代码路径 2 而未被捕捉的 SQL 语句。

驱动程序如何处理 SQL 语句:PureQuery for JDBC applications 允许应用 程序开发人员或 DBA 在部署时才决定以动态模式(例如在开发时)、混合模式( 在测试时)还是静态模式(在生产时)运行应用程序的 SQL:

如果 executionMode 属性被设置为 DYNAMIC,则无论之前是否已被捕捉,所 有 SQL 语句都将动态地执行。

如果 executionMode 属性被设置为 STATIC,前面被捕捉、配置和绑定的 SQL 将静态地执行。但是,如果 allowDynamicSQL 属性被设置为 TRUE(默认设置) ,那么其他 SQL 语句将以 DYNAMIC 模式执行。如果该属性被设置为 FALSE,那 么这些语句将得不到处理,并抛出一个 SQLException。

修改驱动程序的 SQL 执行模式,并重新运行示例应用程序的代码路径 1 和 2 ,以便当一条 SQL 语句因缺少元数据信息而不能静态地执行时,抛出一个异常。

打开驱动程序配置文件 DB2JccConfiguration.properties。

利用内容辅助( ),添加属性 allowDynamicSQL 并赋以值 FALSE,如 图 39 所示。

图 40. 防止 SQL 动态执行

保存这个配置文件( ),但不要关闭编辑器。一会儿 您还要修改它。

在 Package Explorer 中找到 BasicJDBCApp.java,右键单击它,并从上下文 菜单中选择 Run As>Java Application,重新运行示例应用程序。

应用程序应该终止,并收到一个错误,表明一个 SQL 异常(见图 41)被抛出 。

图 41. 由于缺少元数据,SQL 不能静态地执行

捕捉剩下的 SQL

增量式地捕捉 SQL

在驱动程序配置为仅以静态模式执行 SQL 语句时,有些 SQL 语句没有被捕捉 ,要解决处理这些 SQL 语句的问题,必须再完成一次为 JDBC 应用程序启用 pureQuery 的迭代过程:

通过运行前面没有运行过的用例,增量式地捕捉缺少的 SQL 语句。

配置新捕捉到的元数据。

重新绑定数据库包,增加新的 SQL 语句。

重新运行应用程序,验证它在静态执行模式下是否有正确的行为。

为了解决防止示例应用程序静态地执行所有 SQL 语句的问题,必须遵循以下 步骤:

捕捉执行代码路径 2 时发出的 SQL 语句。

在驱动程序配置文件 DB2JccConfiguration.properties 中修改 executionMode 和 captureMode 属性,以便捕捉并动态地执行 SQL 语句,如图 42 所示。

图 42. 允许捕捉 SQL

注意,还可以使用一个稍微不同的驱动程序配置,该配置将导致以下运行时行 为,但产生的结果是一样的:

如果前面已捕捉、配置和绑定 SQL,它则静态执行

如果前面没有捕捉、配置和绑定 SQL,它则动态执行

如果 SQL 动态执行,则捕捉它

db2.jcc.pdqProperties=captureMode(ON),           executionMode(STATIC),allowDynamicSQL (TRUE),           pureQueryXml(pureQueryFolder/capture.pdqxml)

(以上例子中使用了换行,这仅仅是为布局考虑)。

在运行配置中使用以下程序参数之一(用有效的数据库名、用户 ID 和密码替 换参数值),重新运行示例应用程序,并执行代码路径 2(或执行全部 2 条代码 路径),捕捉缺少的 SQL 语句。

jdbc:db2://localhost:50000/GS_DB db2admin mypwd 2jdbc:db2://localhost:50000/GS_DB db2admin mypwd

配置和重新绑定更新后的元数据。

在 Package Explorer 中,选择 ClientOptimization 项目,单击右键并选择 Refresh。

选择更新后的元数据文件 pureQueryFoldercapture.pdqxml,打开 pureQueryOutline 视图,单击 outline refresh 按钮,以便重新装载视图,并 使用配置文件 Default.genProps 中的当前设置重新配置捕捉的元数据。

图 43. 使用 pureQuery Outline 视图查看新捕捉的 SQL

查看数据库包预览(SQL)选项卡的内容。应该有一条或多条 SQL 语句被添加 到包中。

选择 pureQueryFoldercapture.pdqxml 并单击右键,选择 pureQuery > Bind… 重新绑定包。

以静态 SQL 执行模式重新运行示例应用程序。

再次修改 DB2JccConfiguration.properties,关闭捕捉模式,打开静态 SQL 执行模式:db2.jcc.pdqProperties=captureMode(OFF),           executionMode(STATIC),allowDynamicSQL (FALSE),           pureQueryXml(pureQueryFolder/capture.pdqxml)

(以上例子中使用了换行,这仅仅是为布局考虑) 。

运行应用程序三次。每次通过更改运行配置执行一条不同的代码路径: jdbc:db2://localhost:50000/GS_DB db2admin mypwd 1jdbc:db2://localhost:50000/GS_DB db2admin mypwd 2jdbc:db2://localhost:50000/GS_DB db2admin mypwd

示例应用程序现在应该能够成功地静态执行它的 SQL 语句。

结束语

恭喜!您已经成功使用 Data Studio Developer 为一个现有的 JDBC 应用程 序启用了 pureQuery。为了简单起见,我们选择了一个简单的应用程序,而且没 有讨论计划阶段。计划阶段不仅识别应用程序是否适合启用 pureQuery 的,并且 产生一些本教程基于其上的配置和部署决策。此外,在一个典型的用例中,有一 些重要的方面必须考虑;下面列出了其中一部分:

安全性:在本教程中,您将数据库对象安全模型从基于数据库对象换成基于包 。这一变化对于谁能成功地运行应用程序会产生影响。

有些 JDBC 编程实践和通常的限制可能使您不能静态地运行每条 SQL 语句。 因此,在某些情况下,如果需要完成静态的 SQL 执行,必须修改 JDBC 应用程序 的实现。如果源代码不能修改(例如,应用程序是第三方的),则不得不动态地 执行选择的 SQL。

在中大型的项目中,可以使用 Data Studio Developer 将一些手动执行的任 务自动化。pureQuery 提供了一些命令行实用程序,可以用它们来简化过程,例 如在批处理模式中将包绑定到多个测试或生产数据库。

部署到生产以及角色的职责:通常,在为应用程序启用 pureQuery 以及将这 样的应用程序部署到测试和生产中时,会涉及多个具有不同角色的用户。这些用 户需要紧密协作,以确保成功地为目标应用程序启用 pureQuery,以及部署和维 护目标应用程序。

致谢

我们要感谢 Kathy Zeidenstein 对本教程的贡献,同时也感谢 Chris Farrar 审校了本教程。

本文配套源码

失败是成功的亲娘,没有失败哪来的成功呢?诺贝尔如果不经历千万次的失败,

使用pureQuery优化现有的JDBC应用程序

相关文章:

你感兴趣的文章:

标签云: