7.4. 恢复模块
每个 XA 资源都需要一个对应的恢复模块,它在
jbossjta-properties.xml
里的 "jta" 部分进行配置。每个恢复模块都必须继承 com.arjuna.ats.jta.recovery.XAResourceRecovery
。我们提供用于 JDBC 和 JMS XA 资源的实现。
7.4.1. JDBC 恢复
JBoss 企业级应用程序平台现在包含了 JCA 里的恢复自动注册。因此,之前版本使用的 AppServerJDBCXARecovery 缺省是禁用的,且会在以后的版本里完全删除。
7.4.1.1. 供应商专有的数据库信息
- Oracle
- 如果没有正确地配置 Oracle,你会在日志文件里看到下面的错误:
WARN [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.recovery.xarecovery1] Local XARecoveryModule.xaRecovery got XA exception javax.transaction.xa.XAException, XAException.XAER_RMERR
要解决这个问题,请确保 Oracle 用户有访问合适的表的权限以完成恢复:GRANT SELECT ON sys.dba_pending_transactions TO user; GRANT SELECT ON sys.pending_trans$ TO user; GRANT SELECT ON sys.dba_2pc_pending TO user; GRANT EXECUTE ON sys.dbms_xa TO user;
上面的语句假设 user 是连接 JBoss 到 Oracle 的用户。它也假定使用的是 Oracle 10g R2(为程序错误#5945463 打了补丁) 或 11g。如果使用了 11g 之前的未打补丁的版本,你需要修改 GRANT EXECUTE 为:GRANT EXECUTE ON sys.dbms_system TO user;
- PostgreSQL
- 请参考 PostgreSQL 文档里关于启用 prepared (如 XA) 事务的说明。8.4-701 版的 PostgreSQL 的 JDBC 驱动在
org.postgresql.xa.PGXAConnection
里有一个程序错误,它在某些情况下会终止恢复。新版本里已经修复了这个问题。 - MySQL
- 根据 http://bugs.mysql.com/bug.php?id=12161 所描述的,MySQL 下 XA 事务恢复是无法实现的。MySQL 6.1 将解决这个问题。请参考 JBoss 企业级应用程序平台 5 发行注记里的 JBPAPP-2576。
- DB2
- 只有在应用服务器在崩溃/失效后重启时指定的重同步阶段,DB2 才期望
XAResource.recover
调用。这是 DB2 的一个设计缺陷,这超出了本文档的范畴。