使用 pureQuery 加速 Hibernate 和 iBATIS 应用程序,第 2 部分: 使用 IBM Integration Module for iBATIS and pureQuery

使用一个新集成模块为 iBATIS 应用程序启用静态 SQL 和异构批处理特性

通过可下载的 IBM® Integration Module 扩展后,IBM Optim™ pureQuery Runtime 简化了为 Hibernate 和 iBATIS 应用程序生成 DB2® 静态 SQL 的流程。这个流程不需要您修改您的应用程序代码,或者从产品工作负载收集 SQL。Optim pureQuery Runtime 还允许访问 DB2 或 Informix® 的 Hibernate 和 iBATIS 应用程序利用 pureQuery 中的异构批处理特性。通过异构批处理特性,您可以对多个 INSERTUPDATEDELETE 请求进行批处理,然后跨网络发送它们,即便这些请求引用多个表。本文是一个两部分文章系列的第二部分,介绍如何将 IBM Integration Module 用于 iBATIS 应用程序。本文附带一个可下载样例应用程序,展示如何使用 iBATIS 应用程序轻松实现静态 SQL 和异构批处理功能。本系列第一部分主要关注 Hibernate 应用程序。

Ambrish Bhargava, 资深软件工程师, IBM China

Ambrish Bhargava 的照片Ambrish Bhargava 是 IBM 印度软件实验室开源团队的一名资深软件工程师,他的工作是为 iBATIS 和 Hibernate 应用程序提供 DB2 Static SQL 支持。此前,他从事 IBM DB2 和 Informix 的 PHP 扩展开发,是 DB2-Django 适配器的原创者。他毕业于班加罗尔国际信息技术学院(International Institute of Information Technology,IIIT),获得信息技术专业硕士学位。



Mario Briggs, 资深软件工程师, IBM China

Mario  Briggs 的照片Mario Briggs 负责 IBM DB2 和 IBM Informix 的开源服务,包括 PHP、Ruby/Rails、Python/Django/SqlAlchemy、Perl 和 Java 数据访问框架。Mario 有 11 年的软件开发经验,其中有多年主要专注于数据访问、关系引擎和应用程序数据库性能领域。



2010 年 12 月 27 日

简介

通过使用 DB2 静态 SQL 和 pureQuery 异构批处理特性,IBM Integration Module for iBATIS and pureQuery 帮助您加速并更好地管理您的 iBATIS 应用程序。静态 SQL 为访问 DB2 的应用程序同时提供性能和安全优势。异构批处理特性有助于 DB2 和 Informix 数据库应用程序改善性能。

本系列 第 1 部分:使用面向 Hibernate 和 pureQuery 的 IBM Integration Module 主要关注 Hibernate 应用程序,并介绍了下面两个主题,本文将不再重复:

  • pureQuery 平台概述,该平台包含一些开发工具、一个 Java® API、一个运行时、以及一些监视服务(可用于可视化性能指标并关联 SQL 语句和原始 Java 代码)。
  • 不使用 pureQuery API 如何获取 pureQuery 优势,可以通过客户机优化等功能来采集 SQL,或者 IBM Integration Module 提供的其他技术。

集成模块回顾

本文介绍了两种方法来针对不使用 pureQuery API 编写的现有应用程序利用 pureQuery:

  • 在应用程序运行时使用客户端优化采集功能。
  • 使用集成模块来支持程序利用 pureQuery 和 Optim Development Studio 的全部功能,无需执行运行时采集步骤即可可视化和优化 SQL。通过这种方法,集成模块在 Hibernate 或 iBATIS 程序运行之前提取 SQL 及其元数据。这是一种新方法,也是该系列的焦点。

IBM Integration Module for iBATIS and pureQuery 向 iBATIS 应用程序提供以下优势:

  • 无需初始 pureQuery 客户端优化采集步骤,您的 iBATIS 应用程序即可使用静态 SQL。Integration Module 不采用采集步骤,而是从 iBATIS SQLMap 文件提取 SQL。SQL 可以被静态绑定,以便访问 DB2 数据库;还可以被审查、共享、优化和替换,而无需更改应用程序本身。SQL 还可以与应用程序代码关联,以便跟踪性能问题回溯到您的 iBATIS 源代码;或者,SQL 可以与数据库对象更改关联,以便使用 Optim Development Studio 进行影响分析。
  • 您的 iBATIS 应用程序能够使用 pureQuery 中的异步批处理特性。这个特性允许您对多个 INSERTUPDATEDELETE 请求进行批处理,即使它们引用多个表。通过异构批处理特性,这些跨表更新只需访问数据库一次即可完成。每次数据库服务器往返旅程都需要付出昂贵的性能代价。因此,拥有更少但更大型的批量和往返旅程有助于提高性能。DB2 和 Informix 数据库服务器都提供这种支持。

iBATIS 项目说明

2010 年初,iBATIS 项目离开了 Apache。它现在称为 MyBatis。您可以从 MyBatis 或旧版 iBATIS 使用 Integration Module 和 iBATIS v2.3.x。

本文介绍如何设置和使用 IBM Integration Module for iBATIS and pureQuery。本文首先描述集成模块的静态 SQL 特性,然后描述异构批处理特性。本文假定您对 iBATIS V2.3 有一定了解,且正在使用 iBATIS V2.3.x。无需更改您的应用程序代码,您就可以利用 Integration Module 提供的优势。


使用 Integration Module for iBATIS and pureQuery 创建静态 SQL

本小节展示使用动态 SQL 的 iBATIS 应用程序和使用 Integration Module 来创建和使用静态 SQL 的应用程序的默认执行路径之间的区别。要了解静态 SQL 的背景知识及其潜在性能好处,请参阅本文 参考资料 中关于静态 SQL 的文章链接。

使用 JDBC 的动态 SQL 执行

图 1 展示了一个典型 iBATIS 应用程序的高级执行。iBATIS SQLMap 中写入的所有 SQL 语句都针对数据执行,使用 JDBC 来准备和执行这些操作。

图 1. 一个 iBATIS 应用程序的典型执行(动态)
iBATIS 从 SQLMap 文件读取 SQL 字符串,转到 JDBC 驱动程序,然后访问数据库。

使用 Integration Module 和 pureQuery 的静态 SQL 执行

图 2 展示了一个 iBATIS 应用程序使用 Integration Module 的高级执行。这些 DB2 包已针对静态 SQL 执行创建。图 2 描绘了以下步骤:

  1. 一个 SQL 生成步骤(iBatisGen)将 iBATIS 应用程序使用的 SQL 收集到一个 pureQuery XML 文件中(这些文件的文件类型为 .pdqxml)。然后可以在 Optim Development Studio 中使用这个文件来进行调优和影响分析,无需一个 BIND 步骤。pureQuery XML 采集文件可以通过 Static Binder 绑定到这些静态包中。
  2. 应用程序执行期间,pureQuery Runtime 重定向 JDBC 调用来执行生成步骤中创建的 DB2 静态包。pdq.properties 文件控制 pureQuery Runtime 执行行为(动态或静态),并提供 pureQuery XML 文件的位置。
图 2. 使用集成模块的 iBATIS 应用程序的静态 SQL 执行
iBatisGen 创建 PDQXML 文件,后者在 DB2 中创建静态包。pureQuery 重定向 JDBC 调用以执行静态包。

Integration Module 提取的是哪些 SQL?

Integration Module 提取应用程序的 iBATIS SQLMap 文件中定义的所有 SQL 语句,但下列语句除外:

  • CALLVALUESDDL SQL 语句
  • 包含 iBATIS 动态构件的 SQL 语句

使用 Integration Module 的异构批处理支持概述

如前所述,pureQuery 异构批处理能够帮助您节约网络成本。本小节展示 iBATIS 应用程序中使用的默认批处理和 pureQuery 异构批处理之间的区别。

iBATIS 中使用 JDBC 的默认批处理

图 3 展示了不使用 pureQuery 异构批处理的样例 iBATIS 应用程序的高级执行。iBATIS 中的默认 SqlExecutor 使用 JDBC 同构批处理特性对在 iBATIS startBatchexecuteBatch 调用之间执行的 INSERTUPDATEDELETE 语句进行批处理。

图 3. 默认 JDBC 同构批处理
iBATIS 从 SQLMAP 文件中的语句创建批量,转到 JDBC 驱动程序,然后访问数据库。

iBATIS 中使用 pureQuery 的异构批处理

图 4 展示了使用 pureQuery 异构批处理特性的样例 iBATIS 应用程序的高级执行。pureQuery SqlExecutor 使用异构批处理特性来对在 iBATIS startBatchexecuteBatch 调用之间执行的 INSERTUPDATEDELETE 语句进行批处理。

IBM Integration Module 实现 SqlExecutor 接口来利用 pureQuery 批处理特性,将 INSERTUPDATEDELETE 语句路由到 pureQuery 而不是 JDBC。

图 4. 使用 pureQuery 异构批处理特性的 iBATIS 应用程序的执行
操作穿过自定义 Batcher;到达 pureQuery 运行时;到达 sqlj 和 jdbc 的数据服务器驱动程序;到达数据库。

使用 IBM Integration Module for iBATIS and pureQuery 的先决条件

参考资料 包含 IBM Integration Module for iBATIS and PureQuery 的下载链接。

软件

下面是使用 pureQuery Integration Module 的软件要求:

  • Optim pureQuery Runtime 2.2.0.3 或更高版本。(参见 参考资料 部分中的链接,下载 IBM Optim Development Studio 和 Optim pureQuery Runtime 的 30 天试用版。这个运行时必须 与 Optim Development Studio 位于同一台机器上。)
  • 确保您的类路径中有 pdq.jar 和 pdqmgmt.jar。
  • IBM Data Server Driver for JDBC and SQLJ 3.58 或 4.7(Optim Development Studio 附带,或者参见 参考资料 部分的下载链接)。
  • iBATIS V2.3.x.xxx.

受支持的数据库

当应用程序访问以下任一数据库时,IBM Integration Module for iBATIS and pureQuery 有效:

  • DB2 for Linux®, UNIX®, and Windows® V8.2,Fix Pack 11 或更高版本
  • DB2 for Linux, UNIX, and Windows V9.1、V9.5 或 V9.7
  • DB2 for i V5R4(仅适用异构批处理特性)
  • DB2 for z/OS® V8 或更高版本
  • Informix Dynamic Server V11.10 或 V11.5(仅适用异构批处理特性)

本文中使用的样例应用程序

本文 下载 部分中的 DemoIbatisApp.zip 文件包含一个样例应用程序,用于演示这个功能。


为 iBATIS 应用程序启用 pureQuery 静态 SQL

本小节使用样例 iBATIS 应用程序来解释 IBM Integration Module 如何支持静态 SQL。

配置类路径

要编译这个样例应用程序,您的类路径中需要以下 jar 文件,以及 iBATIS 应用程序需要的其他 jar 文件:

  • iBATIS jar 文件(比如 iBatis-2.3.x.xxx.jar)
  • pdqibatis.jar(集成模块附带)

要使用 IBM Integration Module,您的类路径中还需要包含以下 jar 文件:

  • pdq.jar
  • pdqmgmt.jar
  • db2jcc jars

使用 versionvalidator 实用程序检查先决条件

Integration Module 包含一个名为 versionValidator 的程序,它对类路径执行一个先决条件检查,检查 iBATIS、JDBC Driver 和 pureQuery Runtime 的版本。清单 1 展示了运行该程序的命令。

清单 1. 运行 versionValidator 程序的命令

java com.ibm.pdq.ibatis.utility.VersionValidator

如果您的类路径中包含的 jar 文件位于正确的级别,则 versionValidator 程序显示与清单 2 类似的消息:

清单 2. 所有先决条件都正确时 versionValidator 程序的输出
> set CLASSPATH=./pdq.jar;./pdqmgmt.jar;./ibatis-2.3.4.726.jar;./db2jcc.jar;
./pdqibatis.jar

> java com.ibm.pdq.ibatis.utility.VersionValidator

IBM integration module version: 2.2.0.3

Found pdqmgmt.jar

PDQ runtime version: 2.18.120

IBM DB2 JDBC Universal Driver: 3.58

java version: 1.6.0

如果您的类路径中的任一 jar 文件处于错误的级别,则 versionValidator 程序显示一条适当的错误消息。例如,清单 3 中的消息显示 DB2 JDBC 驱动程序处于错误的级别,不能用于 Integration Module,且必要的 PDQ jar 文件不在类路径中。

清单 3. 先决条件错误时 versionValidator 程序的输出
> set CLASSPATH=./ibatis-2.3.4.726.jar;./db2jcc.jar;./pdqibatis.jar

> java com.ibm.pdq.utility.VersionValidator

IBM integration module version: 2.2.0.3 

**** ERROR. pdqmgmt.jar not found in classpath 

**** ERROR. pdq.jar not found in class path

Found IBM DB2 JDBC Universal Driver version: 3.53 **** ERROR. Incorrect level. Requires 
V3.58 or higher

java version: 1.6.0

准备样例应用程序的数据库

按照以下步骤准备样例应用程序的数据库:

  1. 创建一个名为 ibatdemo 的数据库
  2. 解压 DemoiBatisApp.zip 文件,将样例应用程序作为一个 Java 项目导入您的 Optim Development Studio 工作空间。样例应用程序使用以下 Java beans:
    • 包含子类 Customer 的 CustomerInfo
    • District
    • Item
    • Order
  3. 在项目构建路径中包含 配置类路径 小节中列示的 jar 文件。您可以在项目构建路径中添加 pureQuery and IBM Data Server for JDBC and SQLJ jar 文件,操作方法是右键单击项目并选择 pureQuery > Add pureQuery support...
  4. 编辑 SqlMapConfig.properties 文件,为您的系统指定正确的数据库属性。对于样例应用程序,这个文件位于 src\demo\data\SqlMapConfig.properties 中,如清单 4 所示。这个流程的其他步骤需要这个文件。
    清单 4. SqlMapConfig.properties 文件细节
    driver=com.ibm.db2.jcc.DB2Driver
    url=jdbc:db2://localhost:50000/ibatdemo
    dataSourceType=SIMPLE
    username=db2admin
    password=db2admin
    #sql_executor_class=com.ibm.pdq.ibatis.executor.PDQSqlExecutor
  5. 为样例应用程序创建数据库表。运行 demo.DatabaseSetup.java,在数据库中创建一些表。要在 Optim Development Studio 上运行 demo.DatabaseSetup.java,右键单击文件并选择 Run As > Java Application。demo.DatabaseSetup.java 在数据库中创建样例应用程序需要的所有表。

为静态 SQL 执行生成 pureQuery XML 文件

使用 iBatisGen 命令为样例应用程序生成一个 test.pdqxml 文件。Integration Module 附带命令的批文件(iBatisGen.bat)。您的类路径需要 iBATIS 需要的所有 jar 文件,以及以下 jar 文件:

  • pdqibatis.jar
  • pdq.jar and pdqmgmt.jar
  • db2jcc.jar and db2jcc_license_cisuz.jar

清单 5 展示了设置类路径以包含必要的 jar 文件并执行 iBatisGen 命令的命令。

清单 5. 使用 iBatisGen.bat 生成 PDQXML 文件
> set CLASSPATH=./iBatis-2.3.4.726.jar;./db2jcc.jar;./db2jcc_license_cisuz.jar;
./pdq.jar;./pdqmgmt.jar;./pdqibatis.jar;

> set CLASSPATH=bin;%CLASSPATH%

> iBatisGen -configFile demo/data/SQLMapConfig.xml

在上面的代码中,bin 目录包含所有应用程序类文件和应用程序的其他文件(比如,iBATIS 和 XML 文件)。

iBatisGen 命令完成后,验证它在当前工作目录(iBatisGen.bat 文件所处的目录)中创建了一个名为 SQLMapConfig.pdqxml 的文件。

注意:iBatisGen 使用 resultsetHoldability 的默认 JDBC 生成 SQL。但是,WebSphere® Application Server 使用一个不同的 resultsetHoldability 默认值。如果您正在将 iBATIS 应用程序部署到 WebSphere Application Server 上,请检查 WebSphere Application Server 数据源的 resultsetHoldability,并如清单 6 所示在 iBatisGen 命令上指定它。

清单 6. iBatisGen WebSphere Application Service 默认设置
>  iBatisGen -configFile demo/data/SQLMapConfig.xml -resultsetHoldability 2

iBatisGen 还有各种其他选项可用。要获取可用选项列表,请发出 iBatisGen 命令和 -help 选项,如清单 7 所示。

清单 7. 列示 iBatisGen 命令的选项
> iBatisGen -help

为静态 SQL 执行而配置并绑定 pureQuery XML 文件

为了以静态方式运行应用程序,需要配置并绑定生成的 SqlMapConfig.pdqxml。操作方法是使用标准 pureQuery ConfigureStaticBinder 命令,如清单 8 所示。StaticBinder 命令在 DB2 服务器上创建一些包。当您运行这些命令时,请确保 pdq.jar、pdqmgmt.jar 和对应的 JCC 驱动程序 jar 文件位于类路径中。要了解关于 pureQuery ConfigureStaticBinder 命令的更多信息,请参见 参考资料 部分。

清单 8. 为静态 SQL 执行而配置并绑定 pureQuery XML 文件
> java com.ibm.pdq.tools.Configure 
	
	-rootPkgName test 
	
	-pureQueryXml SqlMapConfig.pdqxml

> java com.ibm.pdq.tools.StaticBinder

	-url jdbc:db2://localhost:50000/ibatdemo
	
	-username xx
	
	-password xx
	
	-pureQueryXml SqlMapConfig.pdqxml
	
	-traceFile demo_trace.txt
	
	-traceLevel ALL

使用静态 SQL 运行应用程序

清单 9 展示了样例应用程序中包含的 pdq.properties 文件中使用的属性。

清单 9. 样例应用程序的 pdq.properties 文件
pdq.captureMode=OFF
pdq.executionMode=STATIC
pdq.pureQueryXml=SqlMapConfig.pdqxml

下面解释属性设置:

  • captureMode=OFF 表明采集功能关闭。您只有在使用本系列第一部分中描述的客户机优化流程时才需要开启采集功能。
  • executionMODE=STATIC 表明应该使用静态(而不是动态)模式。
  • pureQueryXml=SqlMapConfig.pdqxml 提供运行 iBatisGen 命令时创建的 pureQuery XML 文件的名称和位置。

要了解关于所有 pdq 属性的更多信息,请参见 参考资料 部分。

在样例应用程序包含的实际 pdq.properties 文件中,所有属性都被注释掉(每行都以 # 开头)。继续之前,编辑文件,删除 # 字符以取消 3 个属性的注释,保存文件。完成后,该文件将如清单 9 所示。

现在您可以通过执行 MainClient.java 来运行样例应用程序。来自样例应用程序的 SQL 语句将静态执行。

要在 Optim Development Studio 上运行 MainClient.java,右键单击文件并选择 Run As > Java Application


为 iBATIS 应用程序启用 pureQuery 异构批处理特性

要利用 pureQuery 的异构批处理支持,必须使用 iBATIS(或 MyBatis)V2.3.5。参考资料 部分提供了一个链接,可用于下载这个版本。

要为在 iBATIS API 的 startBatchexecuteBatch 调用之间执行的 INSERTUPDATEDELETE 语句开启异构批处理支持,需要为 iBATIS 注册 pureQuery SqlExecutor。为此,编辑 SqlMapConfig 属性文件并将 sql_executor_class 属性的值设置为 com.ibm.pdq.ibatis.executor.PDQSqlExecutor

样例应用程序中包含的 SqlMapConfig.properties 文件中的这个属性注释掉了(行首为 #)。要为样例应用程序开启异构批处理支持,只需编辑 SqlMapConfig.properties 文件,删除 # 字符以取消注释,然后保存文件。注释字符删除之后,该属性将如清单 10 所示。

清单 10. 在 iBATIS 中启用 pureQuery 批处理支持的必要属性
sql_executor_class=com.ibm.pdq.ibatis.executor.PDQSqlExecutor

使用异构批处理特性运行 iBATIS 应用程序

现在可以通过执行 MainClient.java 来运行样例应用程序了。pureQuery SqlExecutor 确保异构批处理执行。


同时使用静态 SQL 和异构批处理特性

静态 SQL 和异构批处理特性都是正交的,这意味着 iBATIS 应用程序可以同时使用静态 SQL 和异构批处理特性,也可以单独使用每个特性。每个特性的设置步骤没有任何重叠:


结束语

IBM Integration Module for pureQuery and iBATIS 帮助您为 DB2 服务器上的 iBATIS 应用程序启用静态 SQL 执行支持。通过将 SQL 语句链接到它们起源的 iBATIS 工件 (即 SQLMap 文件),它增强了问题发现。现在,您可以收获 IBM DB2 的静态 SQL 的好处了 — 通过消除在运行时进行准备的必要性来改善性能,优化 SQL,减少 SQL 注入风险,以及通过仅向 DBMS 包授权来提高安全性。

IBM Integration Module for PureQuery and iBATIS 能够在 DB2 和 Informix 数据服务器(其中异构批处理特性用于适当的应用程序)上提供巨大的运行时间收益。这些性能改进同时适用 JEE 和 J2SE 环境。


下载

描述名字大小
本文样例 iBATIS 应用程序DemoIbatisApp.zip22KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, Java technology, Open source
ArticleID=605174
ArticleTitle=使用 pureQuery 加速 Hibernate 和 iBATIS 应用程序,第 2 部分: 使用 IBM Integration Module for iBATIS and pureQuery
publish-date=12272010