Unable to persist timer in Oracle XA data source
gquintana Dec 22, 2004 12:09 PMHello,
I have create a Timer table in by Oracle 9i database:
create table TIMERS( TIMERID varchar2(80) not null , TARGETID varchar2(80) not null , INITIALDATE timestamp not null , TIMERINTERVAL number(20) , INSTANCEPK raw(2000) , INFO raw(2000) , constraint TIMERS_PK primary key (TIMERID,TARGETID) )
I have changed in the ejb-deployer.xml the data source for Timers persistence to my Oracle XA data source, but I get the following exception:
2004-12-22 16:25:11,427 ERROR [org.jboss.ejb.txtimer.TimerServiceImpl] Cannot create txtimer
java.lang.IllegalStateException: Unable to persist timer
at org.jboss.ejb.txtimer.DatabasePersistencePolicy.insertTimer(DatabasePersistencePolicy.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:144)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:249)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
at org.jboss.mx.util.JMXInvocationHandler.invoke(JMXInvocationHandler.java:272)
at $Proxy409.insertTimer(Unknown Source)
at org.jboss.ejb.txtimer.TimerServiceImpl.createTimer(TimerServiceImpl.java:206)
at org.jboss.ejb.StatelessSessionEnterpriseContext$TimerServiceWrapper.createTimer(StatelessSessionEnterpriseContext.java:273)
at fr.monentreprise.monprojet.monpaquetage.MonTimerBean.creerTimer(MonTimerBean.java:73)
(...)
Caused by: java.sql.SQLException: ORA-02049: Temporisation : transaction distribuée attend un verrou
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.oci8.OCIDBAccess.check_error(OCIDBAccess.java:2355)
at oracle.jdbc.oci8.OCIDBAccess.executeFetch(OCIDBAccess.java:1760)
at oracle.jdbc.oci8.OCIDBAccess.parseExecuteFetch(OCIDBAccess.java:1921)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2152)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2035)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2876)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:609)
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:316)
at org.jboss.ejb.txtimer.GeneralPurposeDatabasePersistencePlugin.insertTimer(GeneralPurposeDatabasePersistencePlugin.java:156)
at org.jboss.ejb.txtimer.DatabasePersistencePolicy.insertTimer(DatabasePersistencePolicy.java:120)
... 55 more
The Oracle error code means:
ORA-02049: timeout: distributed transaction waiting for lock
Cause: Exceeded INIT.ORA DISTRIBUTED_LOCK_TIMEOUT seconds waiting for lock.
Action: Treat as a deadlock.
I already noticed that
- Timer persistence over a non-XA Oracle data source worked, so the database schema is right.
- I use the same Oracle XA data source from my EJBs and it works so it's properly configured!
Is it possible to use Timers persistence through an Oracle XA data source?
Thanks for your help,
Gérald