viernes, 10 de octubre de 2014

Recuperación de transacciones Oracle en WebSphere (AS) 8.5

En el momento de iniciar el servidor de aplicaciones después de una caída, éste intenta recuperar las transacciones de base de datos correspondientes a data sources XA. Con una base de datos Oracle en ocasiones se presenta la siguiente excepción:
0000048 XARminst E WTRN0037W: The transaction service encountered an error on an xa_recover operation. The resource was com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl@e0881a27. The error code was XAER_RMERR. The exception stack trace follows: javax.transaction.xa.XAException at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:709) at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.recover(WSRdbXaResourceImpl.java:1116) at com.ibm.ws.Transaction.JTA.XARminst.recover(XARminst.java:141) at com.ibm.ws.Transaction.JTA.XARecoveryData.recover(XARecoveryData.java:716) at com.ibm.tx.jta.impl.PartnerLogTable.recover(PartnerLogTable.java:431) at com.ibm.tx.jta.impl.RecoveryManager.resync(RecoveryManager.java:1534) at com.ibm.tx.jta.impl.RecoveryManager.performResync(RecoveryManager.java:2267) at com.ibm.ws.tx.jta.RecoveryManager.performResync(RecoveryManager.java:117) at com.ibm.tx.jta.impl.RecoveryManager.run(RecoveryManager.java:2220) at java.lang.Thread.run(Thread.java:773)

El problema se debe a que el usuario de base de datos que estamos usando no tiene permisos para recuperar transacciones, lo que se solucciona ejecutando lo siguiente:
grant select on pending_trans$ to <user>;
grant select on dba_2pc_pending to <user>;
grant select on dba_pending_transactions to <user>;
grant execute on dbms_system to <user>;
Si la versión de Oracle es mayor a la 10.2.0.4, se debe remplazar el último privilegio por:
grant execute on dbms_xa to <user>;
Otra manera de solucionarlo, en caso de que no sea importante recuperar las transacciones (por ejemplo en un ambiente de desarrollo), es borrando el contendio del directorio <WebSphere Application Server_install_root>\profiles\<PROFILE_NAME>\tranlog\<CELL_NAME>\<NODE_NAME>\<SERVER_NAME>\transaction antes de iniciar el Application Server.
Visto en www-01.ibm.com