技术开发 频道

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

开发消息流来使用 JDBC XA

    通过使用本文中描述的技术和配置,Broker 可以实现与使用 Type 2 JDBC 驱动程序的 DB2 数据库协调工作的 XA 事务。通过使用 WebSphere MQ 的工具作为分布式平台上的全局事务协调器来协调 Message Broker MQ 操作和 JDBC 操作,从而实现 JDBC XA 支持。这之所以可行,是因为对于使用协调事务配置的消息流,消息流处理线程将在开始工作流的单元前对 DB2 执行事务协调缺省登记操作。正如下面约束与限制部分中所述,消息流必须仅访问 JDBC XA 数据源和 MQ 队列,而不是其他 ODBC 数据源或资源管理器。

在 Java Compute 节点中使用 Java JDBC T2 XA

    为了获得由 WebSphere MQ Transaction Processor 进行协调的 JDBC 操作,必须通过 DB2 JDBC Type 2 驱动程序的 DriverManager Java 接口创建 JDBC 数据源,如 DB2 信息中心中的 How DB2 applications connect to a data source using the DriverManager interface 中所述。必须在执行消息流的每个唯一 Broker 线程的 Java Compute Node 类的 evaluate() 方法开始时获得数据库连接。获得连接后,应该缓存连接,并在每次相同的线程执行 evaluate() 方法来执行工作单元时进行重用。有关更多信息,请参见下面的使用全局连接工厂和线程级别连接缓存。 

    正如下面约束与限制中所述,这些 JDBC 连接一定只能在不包括拥有 ODBC 的节点的消息流中使用,如 Compute 节点和 Database 节点。以下是典型的数据库连接技术:

/** * createConnection - Connect a thread to the JDBC data source * * @param DB2DB_Name * @param DB2User_ID * @param DB2User_PASSWORD * @return Connection * @throws DB2JdbcXaTestException */ private Connection createConnection(String DB2DB_Name, String DB2User_ID, String DB2User_PASSWORD) throws DB2JdbcXaTestException { Connection jdbcXaConn = null; try { // NB Must only use DB2 App type 2 classes Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance(); // URL form is jdbc:db2:dbname String url = "jdbc:db2:" + DB2DB_Name; Properties props = new Properties(); props.put(new String("user"), DB2User_ID); props.put(new String("password"), DB2User_PASSWORD); jdbcXaConn = DriverManager.getConnection(url, props); } catch (SQLException e) { // TODO Handle failure System.err.println(e.toString()); e.printStackTrace(); } catch (Exception e) { // TODO Handle failure System.err.println(e.toString()); e.printStackTrace(); } return jdbcXaConn; }
   

    Java Compute Node 类中的 Java 代码然后可以像任意正常 JDBC 代码一样使用返回的 Connection 对象。现在没有必要对此连接调用 commitrollback,因为在 Broker 消息流作为消息流处理的一部分内部调用 MQBEGINMQCOMMIT/MQROLLBACK 时,这些工作将由 MQ Transaction Processor 作为全局协调工作单元进行执行。对于启用了“coordinated transaction”的消息流,MQ Transaction Processor 将登记/提交/回滚对工作单元内的 Connection 对象进行的任何工作。事实上,对返回的 Connection 对象调用本地提交或回滚将导致 DB2 JDBC 驱动程序引发异常:

    COM.ibm.db2.jdbc.DB2Exception: [...] SQL0926N SQL ROLLBACK invalid for application execution environment. SQLSTATE=2D521

修改消息流上所需的属性

    将使用 JDBC 通过 Java Compute 节点访问 DB2 且要由流中的 MQ 操作进行协调的消息流必须在 Message Broker 中设置为使用事务:在 flow MQInput node properties 面板的 Advanced 选项卡上,确保 Transaction Mode 设置为 YesAutomatic

修改 BAR 文件上所需的属性

    通过使用 Message Broker Archive (BAR) 编辑器,可编辑消息流的属性。添加包含使用 DB2 JDBC XA 的 Java Compute 节点的流时,必须将流设置为使用协调事务:

  1. 单击 Configure 选项卡。
  2. 为要使用 XA 协调机制的每个消息流选中对应的 Coordinated Transactions
  3. 保存并部署 BAR 文件。

    如果在 BAR File Editor 中删除了 BAR 文件的内容,将必须重新选中流的 Coordinated Transactions。Java Compute Node 类可使用以下代码以编程的方式验证流已设置了此必需属性,确保业务逻辑将在保证协调事务完整性的前提下执行:

MbMessageFlow ourFlow = this.getMessageFlow(); flowName = ourFlow.getName(); // Enforce XA processing - validate flow has been // deployed with Coordinated Transaction property set if (!ourFlow.isCoordinatedTransaction()) { // TODO Flag deployment properties error via throw MbUserException }
0
相关文章