Thread: XA capable driver
I'm not totally up to par about knowing what XA capabilities are in a driver, but as I understand it, my errors are because the postgres driver doesn't support XA datasources.
Problem is I'm not sure how to fix this? Is there a postgres driver somewheres that does support them or do I need to make different JBoss (application server) configurations of my datasources?
Any help much appreciated.
On Tue, 30 Jul 2002, G.L. Grobe wrote: > I'm not totally up to par about knowing what XA capabilities are in a > driver, but as I understand it, my errors are because the postgres > driver doesn't support XA datasources. > > Problem is I'm not sure how to fix this? Is there a postgres driver > somewheres that does support them or do I need to make different JBoss > (application server) configurations of my datasources? Which version of JBoss? The jboss.jcml exerpt below works for 2.4.x. Aaron <mbean code="org.jboss.jdbc.JdbcProvider" name="DefaultDomain:service=JdbcProvider"> <attribute name="Drivers">org.postgresql.Driver</attribute> </mbean> <mbean code="org.jboss.jdbc.XADataSourceLoader" name="DefaultDomain:service=XADataSource,name=postgres"> <attribute name="PoolName">postgres</attribute> <attribute name="DataSourceClass">org.jboss.pool.jdbc.xa.wrapper.XADataSourceImpl</attribute> <attribute name="Properties"></attribute> <attribute name="URL">jdbc:postgresql://server/database</attribute> <attribute name="GCMinIdleTime">1200000</attribute> <attribute name="JDBCUser">user</attribute> <attribute name="MaxSize">10</attribute> <attribute name="Password">password</attribute> <attribute name="GCEnabled">false</attribute> <attribute name="InvalidateOnError">false</attribute> <attribute name="TimestampUsed">false</attribute> <attribute name="Blocking">true</attribute> <attribute name="GCInterval">120000</attribute> <attribute name="IdleTimeout">1800000</attribute> <attribute name="IdleTimeoutEnabled">false</attribute> <attribute name="LoggingEnabled">false</attribute> <attribute name="MaxIdleTimeoutPercent">1.0</attribute> <attribute name="MinSize">2</attribute> </mbean>
I'm using this very thing now. JBoss 2.4.x w/ a data source setup as you've listed below. Even so, there are XA errors and warning I'm receiving in places because the driver is not XA capable and I don't know how to get around this. ----- Original Message ----- From: "Aaron Mulder" <ammulder@alumni.princeton.edu> To: <pgsql-jdbc@postgresql.org> Sent: Wednesday, July 31, 2002 10:31 AM Subject: Re: [JDBC] XA capable driver > On Tue, 30 Jul 2002, G.L. Grobe wrote: > > I'm not totally up to par about knowing what XA capabilities are in a > > driver, but as I understand it, my errors are because the postgres > > driver doesn't support XA datasources. > > > > Problem is I'm not sure how to fix this? Is there a postgres driver > > somewheres that does support them or do I need to make different JBoss > > (application server) configurations of my datasources? > > Which version of JBoss? The jboss.jcml exerpt below works for > 2.4.x. > > Aaron > > > <mbean code="org.jboss.jdbc.JdbcProvider" name="DefaultDomain:service=JdbcProvider"> > <attribute name="Drivers">org.postgresql.Driver</attribute> > </mbean> > > <mbean code="org.jboss.jdbc.XADataSourceLoader" name="DefaultDomain:service=XADataSource,name=postgres"> > <attribute name="PoolName">postgres</attribute> > <attribute name="DataSourceClass">org.jboss.pool.jdbc.xa.wrapper.XADataSourceImpl</attr ibute> > <attribute name="Properties"></attribute> > <attribute name="URL">jdbc:postgresql://server/database</attribute> > <attribute name="GCMinIdleTime">1200000</attribute> > <attribute name="JDBCUser">user</attribute> > <attribute name="MaxSize">10</attribute> > <attribute name="Password">password</attribute> > <attribute name="GCEnabled">false</attribute> > <attribute name="InvalidateOnError">false</attribute> > <attribute name="TimestampUsed">false</attribute> > <attribute name="Blocking">true</attribute> > <attribute name="GCInterval">120000</attribute> > <attribute name="IdleTimeout">1800000</attribute> > <attribute name="IdleTimeoutEnabled">false</attribute> > <attribute name="LoggingEnabled">false</attribute> > <attribute name="MaxIdleTimeoutPercent">1.0</attribute> > <attribute name="MinSize">2</attribute> > </mbean> > > > ---------------------------(end of broadcast)--------------------------- > TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org >
On Wed, 31 Jul 2002, G.L. Grobe wrote: > I'm using this very thing now. JBoss 2.4.x w/ a data source setup as you've > listed below. Even so, there are XA errors and warning I'm receiving in > places because the driver is not XA capable and I don't know how to get > around this. If there's any "postgresql" in the error/warning/stack trace, please post it here. Otherwise, perhaps you could just e-mail it to me off-list. Aaron
> If there's any "postgresql" in the error/warning/stack trace, > please post it here. Otherwise, perhaps you could just e-mail it to me > off-list. Ok, I've included the output below as well as the code that's exec'ing below that. Note that no exceptions are thrown while exec'ing the code as shown. I didn't see anything that actually came from postgres itself. This output came from JBoss 2.4.4 and it's been unanimous from the JBoss forums that this is a problem of the driver not being XA capable. This all seems to happen after the method has fully completed and is called from within a MDB. [WARN,TxCapsule] XAException: tx=XidImpl [FormatId=257, GlobalId=cassia//182, BranchQual=] errorCode=XAER_RMERR javax.transaction.xa.XAException at org.jboss.mq.SpyXAResource.prepare(SpyXAResource.java:169) at org.jboss.tm.TxCapsule.prepareResources(TxCapsule.java:1411) at org.jboss.tm.TxCapsule.commit(TxCapsule.java:330) at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:76) at org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:314) at org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageCons umer.java:565) at org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:376) at org.jboss.mq.SpySession.run(SpySession.java:248) at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:172) at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.ja va:728) at java.lang.Thread.run(Thread.java:484) [WARN,TxCapsule] XAException: tx=XidImpl [FormatId=257, GlobalId=cassia//182, BranchQual=] errorCode=XAER_RMERR javax.transaction.xa.XAException at org.jboss.mq.SpyXAResource.rollback(SpyXAResource.java:201) at org.jboss.tm.TxCapsule.rollbackResources(TxCapsule.java:1540) at org.jboss.tm.TxCapsule.commit(TxCapsule.java:347) at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:76) at org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:314) at org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageCons umer.java:565) at org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:376) at org.jboss.mq.SpySession.run(SpySession.java:248) at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:172) at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.ja va:728) at java.lang.Thread.run(Thread.java:484) [ERROR,StdServerSession] failed to commit/rollback javax.transaction.RollbackException: Unable to commit, tx=XidImpl [FormatId=257, GlobalId=cassia//182, BranchQual=] status=STATUS_ROLLEDBACK at org.jboss.tm.TxCapsule.commit(TxCapsule.java:351) at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:76) at org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:314) at org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageCons umer.java:565) at org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:376) at org.jboss.mq.SpySession.run(SpySession.java:248) at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:172) at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.ja va:728) at java.lang.Thread.run(Thread.java:484) -------------- try { dbConn = getConnection(); update = "UPDATE Tasks SET state = ?, end_time = " + "(SELECT CURRENT_TIMESTAMP), errors = ?, warnings = ? " + "WHERE build_id = ?"; pstmt = dbConn.prepareStatement(update); pstmt.setInt(1, (int) bInfo.getStatus()); pstmt.setInt(2, (int) bInfo.getErrors()); pstmt.setInt(3, (int) bInfo.getWarnings()); pstmt.setInt(4, (int) bInfo.getBuildId()); log.debug(Manager.class, update); int rcnt = pstmt.executeUpdate(); } catch (SQLException sqle) { log.error(Manager.class, sqle.getMessage()); sqle.printStackTrace(); } catch (Exception e) { log.error(Manager.class, e.getMessage()); e.printStackTrace(); } finally { try { if (pstmt != null) pstmt.close(); } catch (Exception e) { log.error(Manager.class, e.getMessage()); } try { if (dbConn != null) dbConn.close(); } catch (Exception e) { log.error(Manager.class, e.getMessage()); } } }
If it was a DB problem, why would JBossMQ (the JBoss JMS implementation) be the one throwing an exception? In a 2-phase commit session, you first prepare all the resources (DB & MQ), then if that all works, you commit. Here the prepare on the MQ fails -- there's no error from the DB. You need to find out why the SpyMQResource is failing to prepare on line 169. I think XAER_RMERR is a generic "Resource Manager Error" message, so it's not obvious what is causing it. Also it happens at the end of the TX, which is why it manifests "after the method has fully completed". In any case, since there are no database errors below, please reply off-list. Aaron On Thu, 1 Aug 2002, G.L. Grobe wrote: > > If there's any "postgresql" in the error/warning/stack trace, > > please post it here. Otherwise, perhaps you could just e-mail it to me > > off-list. > > Ok, I've included the output below as well as the code that's exec'ing below > that. Note that no exceptions are thrown while exec'ing the code as shown. I > didn't see anything that actually came from postgres itself. This output > came from JBoss 2.4.4 and it's been unanimous from the JBoss forums that > this is a problem of the driver not being XA capable. This all seems to > happen after the method has fully completed and is called from within a MDB. > > [WARN,TxCapsule] XAException: tx=XidImpl [FormatId=257, > GlobalId=cassia//182, BranchQual=] errorCode=XAER_RMERR > javax.transaction.xa.XAException > at org.jboss.mq.SpyXAResource.prepare(SpyXAResource.java:169) > at org.jboss.tm.TxCapsule.prepareResources(TxCapsule.java:1411) > at org.jboss.tm.TxCapsule.commit(TxCapsule.java:330) > at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:76) > at > org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:314) > at > org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageCons > umer.java:565) > at > org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:376) > at org.jboss.mq.SpySession.run(SpySession.java:248) > at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:172) > at > EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.ja > va:728) > at java.lang.Thread.run(Thread.java:484) > [WARN,TxCapsule] XAException: tx=XidImpl [FormatId=257, > GlobalId=cassia//182, BranchQual=] errorCode=XAER_RMERR > javax.transaction.xa.XAException > at org.jboss.mq.SpyXAResource.rollback(SpyXAResource.java:201) > at org.jboss.tm.TxCapsule.rollbackResources(TxCapsule.java:1540) > at org.jboss.tm.TxCapsule.commit(TxCapsule.java:347) > at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:76) > at > org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:314) > at > org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageCons > umer.java:565) > at > org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:376) > at org.jboss.mq.SpySession.run(SpySession.java:248) > at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:172) > at > EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.ja > va:728) > at java.lang.Thread.run(Thread.java:484) > [ERROR,StdServerSession] failed to commit/rollback > javax.transaction.RollbackException: Unable to commit, tx=XidImpl > [FormatId=257, GlobalId=cassia//182, BranchQual=] status=STATUS_ROLLEDBACK > at org.jboss.tm.TxCapsule.commit(TxCapsule.java:351) > at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:76) > at > org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:314) > at > org.jboss.mq.SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessageCons > umer.java:565) > at > org.jboss.mq.SpyMessageConsumer.addMessage(SpyMessageConsumer.java:376) > at org.jboss.mq.SpySession.run(SpySession.java:248) > at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:172) > at > EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.ja > va:728) > at java.lang.Thread.run(Thread.java:484) > > -------------- > try { > dbConn = getConnection(); > > update = "UPDATE Tasks SET state = ?, end_time = " > + "(SELECT CURRENT_TIMESTAMP), errors = ?, warnings = ? " > + "WHERE build_id = ?"; > > pstmt = dbConn.prepareStatement(update); > > pstmt.setInt(1, (int) bInfo.getStatus()); > pstmt.setInt(2, (int) bInfo.getErrors()); > pstmt.setInt(3, (int) bInfo.getWarnings()); > pstmt.setInt(4, (int) bInfo.getBuildId()); > > log.debug(Manager.class, update); > > int rcnt = pstmt.executeUpdate(); > } > catch (SQLException sqle) { > log.error(Manager.class, sqle.getMessage()); > sqle.printStackTrace(); > } > catch (Exception e) { > log.error(Manager.class, e.getMessage()); > e.printStackTrace(); > } > finally { > try { > if (pstmt != null) > pstmt.close(); > } > catch (Exception e) { > log.error(Manager.class, e.getMessage()); > } > > try { > if (dbConn != null) > dbConn.close(); > } > catch (Exception e) { > log.error(Manager.class, e.getMessage()); > } > } > } > > > > > ---------------------------(end of broadcast)--------------------------- > TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org >