技术开发 频道

如何通过DB2和WebSphere使用协作事务


实际运用

    随本文提供的下载文件是 Message Broker Toolkit 项目交换文件,提供了以下所示的简单消息流:

所提供的示例消息流

    此消息流包括 Java Compute 节点,该节点使用所介绍的技术来支持数据库表的简单插入操作。要运行此示例,请执行以下操作:

  1. 下载 ZIP 文件,然后使用 File => Import => Project Interchange,将其作为 Porject Interchange 导入您的 Message Broker Toolkit。
  2. 打开 MB_JCN_JDBCXA 项目中的消息文件 MB_JCN_JDBCXA.msgflow 和 Java 类 JavaComputeJdbcXa(该类实现 Java Compute 节点)。对其进行复查,注意 JavaComputeJdbcXa.evaluate() 方法所进行的工作:
    • 确保消息流经过验证(请参见 doValidation())。
    • 直接将输入消息复制到输出中。
    • 获取 JDBC 连接(请参见 getConnection())。
    • 在 DB2 示例数据库 SAMPLEEMPLOYEE 表中插入行(请参见 insertEmployee())。
    • 执行测试,验证连接的确是采用 XA。
  3. 按照上面所讨论的为协调 JDBC 事务准备数据库系统。如果在未针对 XA 协调进行设置的情况下部署和运行流,Message Broker 将发出错误:
    "BIP2633" Warning when starting transaction coordinated by WebSphere MQ;
                    MQBEGIN failed: MQCC=1; MQRC=2122; node 'MB_JCN_JDBCXA.MQInput.

    ,其中 MQRC 为:
    C:\Program Files\IBM\MQSI\6.0.0.3>mqrc 2122
                    2122  0x0000084a  MQRC_PARTICIPANT_NOT_AVAILABLE
                    C:\Program Files\IBM\MQSI\6.0.0.3>
                    

  4. 在数据库中创建带 EMPLOYEE 表的 DB2 SAMPLE 数据库。MB_JCN_JDBCXA 项目中还提供了 Database\employee.ddl 文件。
    db2 => CREATE TABLE "EMPLOYEE"  ("EMPNO" CHAR(6) NOT NULL , "FIRSTNME" VARCHAR(12) NOT
                    NULL ,"MIDINIT" CHAR(1) NOT NULL ,  "LASTNAME" VARCHAR(15) NOT NULL ,  "EDLEVEL" SMALLINT
                    NOT NULL  )
                    DB20000I  The SQL command completed successfully.
                    db2 => commit work
                    DB20000I  The SQL command completed successfully.
                    db2 => connect reset
                    DB20000I  The SQL command completed successfully.
                    

  5. 在 Broker Queue Manager 上为流创建输入和输出 MQ 队列。MB_JCN_JDBCXA 项目中提供了 Queues\queues.mqc 文件。
    def ql(MB_JCN_JDBCXA_IN) bothresh(3) replace
                    def ql(MB_JCN_JDBCXA_OUT) replace
                    

  6. 创建包含 MB_JCN_JDBCXA 消息流的 BAR 文件。然后设置 Coordinated Transaction 和 Additional Instances 属性:

    设置 Coordinated Transaction 和 Additional Instances 属性

    如果在未设置 Coordinated Transaction 的情况下部署流,Java 代码验证将引发用户异常,并导致拒绝所有消息输入:

    Java exception: 'com.ibm.broker.plugin.MbUserException'; thrown from class name:
                    'com.ibm.mbJcnJdbcXa.JavaComputeJdbcXa', method name: 'doValidation', file:
                    'JavaComputeJdbcXa.java', line: '128'; trace text: 'Incorrect setup Flow is not
                    setup for coordinated Transaction';  resource bundle:
                    'com.ibm.mbJcnJdbcXa.JcnJdbcXaMessages'; key: 'DB2JDBCXATEST_FAILURE';
                    

    然后设置以下用户定义属性,从而向 Java 提供数据库名称及部署环境的访问凭证细节:

    恰当地设置数据库名称和访问凭据

  7. 将创建的 BAR 文件部署到代理,并检查是否存在任何错误消息。
  8. 将包含任意有效 XML 的测试消息放在流输入队列 MB_JCN_JDBCXA_IN 上。
  9. 确认消息得到了处理,并被复制到输出队列 MB_JCN_JDBCXA_OUT,而且在 SAMPLE 数据库的 EMPLOYEE 表中创建了新行。

    添加到 EMPLOYEE 表的行


    db2 => SELECT * FROM EMPLOYEE
                    EMPNO  FIRSTNME     MIDINIT LASTNAME        EDLEVEL
                    ------ ------------ ------- --------------- -------
                    4131  MSGBRK       M       JDBCXA               22
                    1 record(s) selected.
                    db2 =>>
                    

        如果未创建新行,则请检查系统事件日志确定原因。如果创建了新行,将使用 XA 协调执行事务,因为 Java 代码将通过确保拒绝本地回滚来执行设置的验证。

约束与限制

  • 必须使用 DB2 "App" JDBC Type 2 驱动程序的 DriverManager 接口获得协调连接——实例化 COM.ibm.db2.jdbc.app.DB2Driver 类的实例。所有通过这种方式建立的连接将基于在流上进行的 Coordinated Transaction 设置来进行协调。
  • 只有分布式平台可用于此配置中——此方法在 z/OS® 上不可行。我们只对 Windows 和 AIX 进行测试。
  • 混合 JDBC / ODBC 消息流不能用于此配置。
  • 在 Message Broker 线程上注册了 XA 资源后,就不能再次对其进行注册。如果尝试重新部署流,可能会得到 MQRC 2195 错误。解决方法是,直接将部署的子项从执行组删除,然后重新部署 BAR 文件。
  • 必须在此配置中使用的 DB2 type 2 "App" JDBC 类并不实现任何连接池操作,因此将为使用 Java Compute 节点(建立到 JDBC XA 源的连接)运行流的每个 Message Broker 线程保留 JDBC 连接。

结束语

     本文介绍了如何在 WebSphere Message Broker V6 Java Compute 节点中实现访问 DB2 数据库的协调事务,从而支持采用标准 JDBC 编写代码,使得构建能在 Message Broker 和其他 Java 环境(如 WebSphere Application Server)中部署的公用 Java 数据访问层成为可能。本文还提供了将解决方案付诸实践的示例项目,能够部署此项目并验证其成功操作。

0
相关文章