5.4. 解决 XA 总结问题
编写 XA 资源的标准 JTA 方法是明确将 XA 资源添加到当前的 javax.transaction.Transaction 对象中,即当前事务。换而言之,每次都开始新事务时,您必须明确获取 XA 资源。
5.4.1. 如何获取 XA 资源 复制链接链接已复制到粘贴板!
Enlisting an XA 资源及事务涉及在 Transaction 接口上调用 enlistResource() 方法。例如,给定一个 TransactionManager 对象和一个 XAResource 对象,您可以按照如下所示列出 XAResource 对象:
列出资源的一个技巧是,资源必须在每个新的事务上被列出,且在开始使用资源前必须被列出该资源。如果您明确获取资源,则可能会得到一个容易出错的代码,这些代码已被 enlistResource() 调用。此外,有时候,在正确的位置调用 enlistResource() 可能比较困难,例如,如果您使用可隐藏部分事务详情的框架,就很困难。
5.4.2. 关于自动清单 复制链接链接已复制到粘贴板!
通过使用支持Aselisting of XA 资源的功能,而不是明确列出了 XA 资源,而是更容易且更安全。例如,在使用 JMS 和 JDBC 资源的情况下,标准技术是使用支持自动清单的 wrapper 类。
JDBC 和 JMS 访问的通用模式是:
-
应用代码要求
javax.sql.DataSource用于 JDBC 访问,而用于 JMS 的javax.jms.ConnectionFactory以获取 JDBC 或 JMS 连接。 - 在应用程序/OSGi 服务器中,注册这些接口的数据库或代理特定实现。
- 应用程序/OSGi 服务器将特定于数据库/代理的因素嵌套成通用池,以及列出因素。
这样,应用程序代码仍然使用 javax.sql.DataSource 和 javax.jms.ConnectionFactory,但在访问这些时,还有额外的功能,通常有问题:
- 连接池 - 并非每次都创建新连接数据库/消息代理,而是使用预先初始化的 连接池。池的 另一个 方面可能是连接的定期验证。
-
JTA enlistment - 在返回
java.sql.Connection(JDBC)或javax.jms.Connection(JMS)实例之前,如果实际连接对象是 true XA 资源,则会注册实际连接对象。如果注册可用,则在 JTA 事务内进行注册。
通过自动列出,应用程序代码不需要更改。
有关为 JDBC 数据源和列出打包程序以及 JMS 连接工厂的更多信息,请参阅 第 6 章 使用 JDBC 数据源 和 第 7 章 使用 JMS 连接工厂。