摘要:Dan Wolfson 就 DB2 和 Websphere MQ 集成方面的谈话
Dan Wolfson
IBM 高级技术人员
2002 年 10 月
专家访谈:Dan Wolfson
就 Dan Wolfson 先前为 DB2® 开发者园地所撰写的两篇文章 DB2 MQ XML 函数:从 DB2 应用程序使用 MQSeries 和 XML Extender和 从 DB2 应用程序使用 MQSeries®,我们收到了许多读者的反馈。以下是 Dan 就其中一些问题所作的回答:
DB2DD 读者:当经过 DB2 接口将消息发送到 MQSeries(WebSphere® MQ)时,对消息大小有限制吗?目前,经过 CICS® 接口发送消息时,消息被限制为 COMMAREA 的最大大小,32K。这会带来分段问题 — 而通过 DB2 与 MQ 的集成也许可以解决。
Dan Wolfson:我们提供的第一个函数集所支持的最大消息为 4000 字节。然而,现在有了比这更新的函数集,它们支持 1MB CLOB。可以在 DB2 UDB V7 修订包 4 的发行说明中找到关于这些函数的信息。此外,我们还扩展了 XML MQSeries 函数以支持 CLOB 值。关于这方面的细节,请参阅 DB2 XML Extender 修订包 4 的发布说明。
DB2DD 读者:DB2 for OS/390® and z/OS™ 是否应用了将 WebSphere MQ(MQSeries)消息传递与数据库应用程序集成的 MQ Series 扩展?
Dan Wolfson:在我最初写那篇文章时,只有在 Windows®、AIX®、Solaris® 和 HP/UX® 上的 DB2 V7.2 有这些函数(如 MQSEND、MQRECEIVE、MQPUBLISH、MQSUBSCRIBE 等)。当然,在这些平台上的 DB2 V8 中也有这些函数。现在我非常高兴地告诉大家,有些函数已经被移植到了 DB2 for z/OS and OS/390 V7,其中包括 MQREAD、MQREADCLOB、MQRECEIVE、MQRECEIVECLOB、MQSEND、MQREADALL、MQREADALLCOB、MQRECEIVEALL 和 MQRECEIVEALLCLOB。请注意,在该平台上也可用 CLOB 函数,它们使消息大小可以超过 4000 字节。APAR PQ59549 可用这些函数。有一篇关于 APAR 的文档,在 2002 年 10 月中旬更新 DB2 软拷贝书籍时, DB2 for OS/390 手册中会有该信息,尤其是在 V7 Application Programming and SQL Guide、 SQL Reference和 Installation Guide中。
OS/390 上的实现实现还支持事务集成(因为在该平台上支持 RRS)。390 系统上的的第一个发行版不包括所有的 XML 集成特性,因为我们正试图尽可能快地发布一些基本函数。我们计划继第一个版本交付之后,尽快地推出第二个版本,第二个版本包括与 XML Extender 相关的函数和其它发布/订阅函数。
DB2DD 读者:相对于两阶段提交,我何时使用单阶段提交?
Dan Wolfson:目前,在 DB2 Universal Database for OS/390 and z/OS 上,MQSeries 函数 仅支持两阶段提交。对于 DB2 for OS/390 或 DB2 for x/OS,UDF 可以支持单阶段提交和两阶段提交。在选择使用哪种提交方式时,可能要考虑以下问题:
支持单阶段提交的 MQSeries 函数:当应用程序使用单阶段提交时,DB2 COMMIT 或 ROLLBACK 操作是独立于 MQSeries 操作的。如果 DB2 事务发生回滚,则不会丢弃已发送到当前工作单元内队列的消息。在发生应用程序错误的情形下,这种方案很有用。您可能希望使用 MQSeries 消息传递来通知系统程序员,应用程序发生了错误。在错误发生之后,应用程序发出 ROLLBACK 以回滚 DB2 工作,但消息仍然被发送到队列,该队列包含相关错误消息。
支持两阶段提交的 MQSeries 函数:如果应用程序使用两阶段提交,则 RRS 控制提交过程。如果 DB2 事务发生回滚,则会丢弃已发送到当前工作单元内队列的消息。例如,假定记录在 DB2 数据库中的销售事务会使 MQSeries 消息被发送到队列。接着,该消息会使库存系统订购备件。如果表示该销售的事务发生回滚,则该消息会被丢弃。在两阶段提交环境中,如果希望强制将 MQSeries 消息添加到消息队列或者从消息队列中删除,则需要在 DB2 应用程序程序中发出一个 COMMIT。
DB2DD 读者:为什么我要使用这些函数,而不是自己编写 MQ 应用程序呢?
Dan Wolfson:我认为主要原因是您可以非常容易地在同一个 SQL 语句中结合队列和数据库操作。所以可以使用一个简单的 SQL 语句将列或表的内容作为消息发布 (select mqsend(lastname) from employee) 或将队列内容插入到表中 (insert into t values (select * from table (mqreceiveall()) t) ) 。也可以在触发器中嵌入消息传递语句等等。此外,客户机应用程序可以利用此功能,而它们的机器上不需要 MQ;只需在 DB2 服务器上安装 MQ。
同样,显而易见,相对于编写自己的 MQ 应用程序,使用 MQ UDF 可以方便系统集成,以及提高性能。理解和配置 MQ UDF 的接口很简单,常见的做法是尽可能地使用可用的 UDF。
DB2DD 读者:设置 AMI 配置会涉及到什么?
Dan Wolfson:这通常包括设置环境变量 AMT_DATA_PATH、AMI 主机文件 amthost.xml 和资源库文件 amt.xml 。一旦设置了 AMT_DATA_PATH 以表明保存在 AMI 配置中的主机文件和资源库文件的位置之后,则与 DB2 UDB 一起提供的 MQ UDF 的 enable 实用程序( enable_MQFunctions)将执行缺省配置。一旦更好地理解了 AMI 的工作方式之后,也可以自己定制配置。
对于 DB2 for z/OS 或 DB2 for OS/390,需要复制和定制 prefix.SDSNSAMP 内的 DSNAMT 和 DSNAMTHT 文件。
DB2DD 读者:有什么可以帮助解析消息?
Dan Wolfson:对于分布式平台上的 DB2,我们有一组 MQ UDF 和 UDB 存储过程(SP),它们作为 DB2 XML Extender(用于处理 XML 类型的消息)的一部分而提供给我们。这些 SP 支持解析队列中的 XML 消息以及将元素值存储到一组预定义 DB2 表。(也支持从表来构造 XML 消息的逆操作)。根据 DAD 文件进行映射,这个 DAD 文件是作为 SP 的输入参数而提供的。关于这方面更详细信息,请参阅 XML Entender 文档。
开发中心(Development Center)还支持生成表函数以自动解析已定义位置或定界的消息。
DB2DD 读者:我们可以使用基本的 DB2 和 Websphere MQ 集成来从 MQ 向 DB2 传递 SQL 更新语句,还是我们需要 MQSI 来做这件事?
Dan Wolfson:您需要 MQSI 来做这件事。根据计划,将来有一些附加的功能,它们可以简化这种交互,但目前只能用 MQSI 或自己编写应用程序。
关于作者
Dan Wolfson 是 IBM Database Technology Institute for e-Business 的高级技术人员和经理。在分布式计算方面,Dan 具有超过 15 年的经验,他的兴趣范围很广,包括数据库、消息传递和事务系统。Dan 目前是信息集成方面的首席架构设计师。