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 的​一​个​设​计​缺​陷​,这​超​出​了​本​文​档​的​范​畴​。​