Strange JBossLocalXAException during a regular transaction
ivanla May 26, 2009 5:08 AMHi.
I'm experiencing a problem, which somehow relates to distributed transactions. I'm using only one local-tx datasource inside the login method of the following session bean and anticipate it being a regular transaction (I don't even control transactions in my code as it is supposed to be CMT). As I understand my datasource is 1PC aware (Forgive me if I show crass ignorance, I'm facing such problem for the first time) why then JBoss involves XA resources in the process and tends to make the transaction 2 phase.
Could anyone explain what is going on?
Here how the datasource is declared:
<local-tx-datasource> <jndi-name>main/jdbc/AuthDS</jndi-name> <connection-url>jdbc:postgresql://localhost:5432/main?schema=masterdb</connection-url> <driver-class>org.postgresql.Driver</driver-class> <user-name>masterdb</user-name> <password>1</password> <metadata> <type-mapping>PostgreSQL 8.0</type-mapping> </metadata> </local-tx-datasource>
And here how the session bean is defined:
@Stateless @Remote(LoginSession.class) @Local(LoginSession.class) @PermitAll public class LoginSessionBean implements LoginSession { private DataSource datasource; private String jndiName = "main/jdbc/AuthDS"; ... public MainPrincipal login(String user, String password) throws LoginException { if (logger.isTraceEnabled()) logger.trace("user=" + user); try{ Context ctx = new InitialContext(); datasource = (DataSource)ctx.lookup("java:"+jndiName); } catch(Exception e) { logger.warn(e, e); } Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { conn = datasource.getConnection(); stmt = conn.prepareStatement(passwordQuery); stmt.setString(1, user); stmt.setString(2, DigestMessage(password)); rs = stmt.executeQuery(); while(rs.next()){ if (logger.isTraceEnabled()) { logger.trace(rs.getString(1) + " (" + rs.getString(2) + ")"); logger.trace("success logged in user=" + user); } return new MainPrincipal(user,password,rs.getString(3)); } stmt = conn.prepareStatement(pincodeQuery); stmt.setString(1, user); stmt.setString(2, DigestMessage(password)); rs = stmt.executeQuery(); while(rs.next()){ if (logger.isTraceEnabled()) { logger.trace(rs.getString(1) + " (" + rs.getString(2) + ")"); logger.trace("success logged in by pincode user=" + user); } MainPrincipal principal= new MainPrincipal(user,password,rs.getString(3)); principal.setByPin(true); return principal; } if (logger.isTraceEnabled()) logger.trace("invalid user login attempt "+ user); } catch (SQLException e) { if (logger.isTraceEnabled()) logger.trace(e, e); throw new LoginException("authentification failure. Message: " + e.getMessage()); } finally { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { if (logger.isTraceEnabled()) logger.trace(e, e); throw new LoginException("authentification failure. Message: " + e.getMessage()); } } return null; } ... }
Following exception appears from time to time when users actively use the system:
2009-05-23 09:58:25,083 WARN [org.hibernate.engine.loading.CollectionLoadContext] On CollectionLoadContext#cleanup, localLoadingCollectionKeys contained [1] entries 2009-05-23 09:58:25,097 WARN [com.arjuna.ats.jta.logging.loggerI18N] [com.arjuna.ats.internal.jta.transaction.arjunacore.enliststarterror] [com.arjuna.ats.i nternal.jta.transaction.arjunacore.enliststarterror] TransactionImple.enlistResource - XAResource.start returned: XAException.XAER_PROTO for < 131075, 28, 26 , 1-aab780b:85d8:4a16ffdf:7511aab780b:85d8:4a16ffdf:7514^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ > 2009-05-23 09:58:25,098 ERROR [STDERR] org.jboss.resource.connectionmanager.JBossLocalXAException: Trying to start a new tx when old is not complete! old: < 2009-05-23 09:58:25,098 ERROR [STDERR] at org.jboss.resource.connectionmanager.TxConnectionManager$LocalXAResource.start(TxConnectionManager.java:886) 2009-05-23 09:58:25,098 ERROR [STDERR] at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.enlistResource(TransactionImple.java:774) 2009-05-23 09:58:25,098 ERROR [STDERR] at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.enlistResource(TransactionImple.java:497) 2009-05-23 09:58:25,098 ERROR [STDERR] at org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener$TransactionSynchronization.enli st(TxConnectionManager.java:773) 2009-05-23 09:58:25,098 ERROR [STDERR] at org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener.enlist(TxConnectionManager.java :564) 2009-05-23 09:58:25,098 ERROR [STDERR] at org.jboss.resource.connectionmanager.TxConnectionManager.managedConnectionReconnected(TxConnectionManager.java:337 ) 2009-05-23 09:58:25,098 ERROR [STDERR] at org.jboss.resource.connectionmanager.BaseConnectionManager2.reconnectManagedConnection(BaseConnectionManager2.java :518) 2009-05-23 09:58:25,098 ERROR [STDERR] at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:399) 2009-05-23 09:58:25,098 ERROR [STDERR] at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnecti onManager2.java:842) 2009-05-23 09:58:25,098 ERROR [STDERR] at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:88) 2009-05-23 09:58:25,098 ERROR [STDERR] at com.avistatime.avista.security.ejb.LoginSessionBean.login(LoginSessionBean.java:101)
Thanks.