捕获应用程序的 SQL
一般而言,如果您开发了一个利用静态 SQL 的应用程序,则需要在定义 SQL 操作的源代码中嵌入一种特殊的编程语言结构。这些语言结构需要提供给一个预编译器来处理,该编译器将生成一些额外的源代码和 SQL 元数据信息。这些 SQL 元数据用于生成一个数据库包(此流程称作绑定),其中包括用于在应用程序运行时执行 SQL 的 SQL 访问计划。生成的源代码包含执行嵌入在数据库包中的 SQL 的逻辑。
虽然 pureQuery 客户机优化静态处理 .NET 应用程序的 SQL 的能力基于相同的基本概念,但它采用的方法稍有不同,它不需要任何源代码分析也不会生成任何额外的源代码。IBM Data Server Provider for .Net 可以被配置为在一种特殊模式中执行,以便捕获应用程序正在提交的 SQL。这些捕获的 SQL 及其相关元数据有两个作用:
- 通过绑定实用工具创建一个或多个包含 SQL 访问计划的数据库包
- 通过 IBM Data Server Provider 在运行时确定经过编译的 SQL 语句是否出现在数据库包中,这将允许它静态地运行此 SQL
将 IBM Data Server Provider for .Net 配置为捕获 SQL
IBM Data Server Provider for .Net 评估运行时配置,以确定是否需要特殊的 pureQuery 处理。如果设置为 ON,则 captureMode 属性将指示数据 Provider 捕获关于在某元数据文件(由 pureQueryXml 属性的值标识)中成功执行的各个 SQL 语句的信息。
 |
配置 pureQuery 配置属性
在数据库连接字符串中定义 pureQuery 配置属性(通常在应用程序配置文件中完成),将它们的范围限制为单个应用程序。在 IBM Data Server 驱动程序配置文件 db2dsdriver.cfg 中定义这些属性,将它们应用于可以由多个应用程序共享的数据源。
|
|
让我们来看一个例子,并假设您的应用程序将连接到 GSDB 数据库。如果应用程序访问本地数据库并且未更改用户 id 和密码,则您的连接字符串应该如下所示:
要启用 Data Server Provider 的 SQL 捕获模型并将捕获的 SQL 存储在一个文件中,您需要将 captureMode 和 pureQueryXml 属性附加在连接字符串后面,并为它们赋予适当的值:
database=GSDB;captureMode=ON;pureQueryXml=c:\myapp.xml |
要将捕获的元数据关联到一个惟一的包标识符,您需要在捕获应用程序的 SQL 时定义两个额外的连接字符串属性:collection
和 rootPkgName。collection 属性标识包所处的集合,而 rootPkgName 属性定义基本数据库包名,绑定实用工具使用该属性生成一个或多个(如果必要)包名。如果 captureMode 设置为 ON,则这两个属性都是必不可少的。
database=GSDB;captureMode=ON;pureQueryXml=c:\myapp.xml;collection=NULLID;rootPkgName=TOOT |
在 SQL 捕获模式中运行时,Provider 可以选择性地生成一个跟踪文件,用于提供关于捕获活动的基本信息。跟踪信息标识了许多内容,其中包括记录了多少新的(或者换种说法,之前未在此 pureQueryXml 文件中捕获的)SQL 语句。要激活跟踪,指定 traceFile 属性并分配一个文件名作为它的值。
pureQuery 捕获活动的典型数据库连接字符串如下所示(为便于阅读,添加了一个换行符):
database=GSDB;captureMode=ON;pureQueryXml=c:\myapp.xml;
collection=NULLID;rootPkgName=TOOT;traceFile=c:\pdqcapturetrace.txt |
现在,您已经了解了如何为 Data Server Provider 配置捕获模式,下面将运行应用程序并捕获其 SQL。如果您使用 testconn20.exe 应用程序来完成本教程,那么您将在运行应用程序时指定数据库连接属性。如果您使用自己的应用程序,请修改其当前数据库连接字符串,并附加之前所讨论的属性。
运行示例应用程序并捕获其 SQL
pureQuery 捕获操作对于应用程序是完全透明的。Data Server Provider 仍然像未配置为利用 pureQuery 技术之前那样处理应用程序的 SQL。惟一能表明捕获活动正在进行的迹像是捕获文件大小在增加和跟踪文件的信息。
如果您使用 testconn20.exe 应用程序,请按照以下步骤运行它。如果您使用自己的应用程序,按照正常方式运行它即可。
- 打开一个命令提示行窗口,切换到 C:\Program Files\IBM\SQLLIB\BIN 目录。
- 输入以下命令运行应用程序(为便于阅读,添加了一个换行符):
testconn20.exe "database=GSDB;captureMode=ON;pureQueryXml=c:\myapp.xml;
collection=NULLID;rootPkgName=TOOT;traceFile=c:\pdqcapturetrace.txt" |
图 5. 捕获 SQL 时的示例程序输出
如果应用程序返回数据库连接错误 SQL8029N,则 Data Server Provider 不能验证 pureQuery 许可。如果出现其他连接错误,请确认 pureQuery 属性的名称和值正确无误。
浏览和配置捕获到的 SQL
在浏览捕获到的 SQL 文件之前,我们先来看看跟踪文件信息。
- 使用您喜欢的编辑器打开您在
traceFile 属性值中指定的跟踪文件。注意,它将显示 Data Server Provider 在捕获模式中运行时所预期的 SQL 语句数量。
图 6. pureQuery 捕获跟踪输出
- 关闭跟踪文件。
- 打开您在
pureQueryXml 属性值中指定的文件,查找捕获到的 SQL。注意,此文件是一个纯文本文件,尽管属性名表示该文件将使用 XML 标记。稍后,本教程在讨论如何使用 DB2 工具绑定此文件时,将告诉您为什么捕获文件现在不使用 XML。
图 7. pureQuery 捕获文件
捕获文件由多个部件组成,每个部分分别包含数据库包配置信息、绑定选项和 SQL 语句信息。
[COMMON] 部分将此捕获文件关联到一个或多个一致性标记,用于在内部确定数据库中的特定数据库包是否与当前的 SQL 捕获文件匹配。由于您尚未将此 SQL 文件绑定到数据库包,因此未分配任何一致性标记。db2cap 实用工具在创建数据库包时将根据需要更新此部分。
顾名思义,[BINDOPTIONS] 部分定义数据库包的特征。bind 实用工具使用此信息创建数据库包,供 Data Server Provider 稍后用于静态执行 SQL。您可以在运行绑定操作之前根据需要定制这些绑定选项,这将在本教程的下一节中讨论。
[STATEMENTx] 部分描述被捕获的 SQL。捕获每个 SQL 都会创建这个部分。各部分包含关于 SQL 文本、指针特征的信息,以及输入和输出参数息。bind 实用工具在创建数据库包时需要使用该信息,并且 Data Server Provider 将使用它确定是否可以静态执行 SQL 语句。您不应该修改这些部分。
- 关闭 pureQuery 捕获文件。
|