[jboss-user] [JCA/JBoss] - Re: Opening connection from a marked rollback tx

vickyk do-not-reply at jboss.com
Wed Nov 14 08:03:37 EST 2007


"oglueck" wrote :  Maybe the connection somehow doesn't get returned to the pool in time or something.
Subsequent Connections are taken from the TransactionLocal and not from the Pool  , here is the code 

  | public ConnectionListener getConnection(Transaction trackByTransaction, Subject subject, ConnectionRequestInfo cri)
  |          throws ResourceException
  |       {
  |          // Determine the pool key for this request
  |          boolean separateNoTx = false;
  |          if (noTxSeparatePools)
  |             separateNoTx = clf.isTransactional();
  |          Object key = getKey(subject, cri, separateNoTx);
  |          SubPoolContext subPool = getSubPool(key, subject, cri);
  |          
  |          InternalManagedConnectionPool mcp = subPool.getSubPool();
  |          
  |          // Are we doing track by connection?
  |          TransactionLocal trackByTx = subPool.getTrackByTx();
  | 
  |          // Simple case
  |          if (trackByTransaction == null || trackByTx == null)
  |          {
  |             ConnectionListener cl = mcp.getConnection(subject, cri);
  |             if (traceEnabled)
  |                dump("Got connection from pool " + cl);
  |             return cl;
  |          }
  | 
  |          // Track by transaction
  |          try
  |          {
  |             trackByTx.lock(trackByTransaction);
  |          }
  |          catch (Throwable t)
  |          {
  |             JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx=" + trackByTransaction, t);
  |          }
  |          try
  |          {
  |             // Already got one
  |             ConnectionListener cl = (ConnectionListener) trackByTx.get(trackByTransaction);
  |             if (cl != null)
  |             {
  |                if (traceEnabled)
  |                   dump("Previous connection tracked by transaction " + cl + " tx=" + trackByTransaction);
  |                return cl;
  |             }
  |          }
  |          finally
  |          {
  |             trackByTx.unlock(trackByTransaction);
  |          }
  | 
  |          // Need a new one for this transaction
  |          // This must be done outside the tx local lock, otherwise
  |          // the tx timeout won't work and get connection can do a lot of other work
  |          // with many opportunities for deadlocks.
  |          // Instead we do a double check after we got the transaction to see
  |          // whether another thread beat us to the punch.
  |          ConnectionListener cl = mcp.getConnection(subject, cri);
  |          if (traceEnabled)
  |             dump("Got connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);
  |          
  |          // Relock and check/set status
  |          try
  |          {
  |             trackByTx.lock(trackByTransaction);
  |          }
  |          catch (Throwable t)
  |          {
  |             mcp.returnConnection(cl, false);
  |             if (traceEnabled)
  |                dump("Had to return connection tracked by transaction " + cl + " tx=" + trackByTransaction + " error=" + t.getMessage());
  |             JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx=" + trackByTransaction, t);
  |          }
  |          try
  |          {
  |             // Check we weren't racing with another transaction
  |             ConnectionListener other = (ConnectionListener) trackByTx.get(trackByTransaction);
  |             if (other != null)
  |             {
  |                mcp.returnConnection(cl, false);
  |                if (traceEnabled)
  |                   dump("Another thread already got a connection tracked by transaction " + other + " tx=" + trackByTransaction);
  |                return other;
  |             }
  |             
  |             // This is the connection for this transaction
  |             cl.setTrackByTx(true);
  |             trackByTx.set(cl);
  |             if (traceEnabled)
  |                dump("Using connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);
  |             return cl;
  |          }
  |          finally
  |          {
  |             trackByTx.unlock(trackByTransaction);
  |          }
  |       }
  | 
If you enabled track-connection-by-tx and you are getting the connections in applicaition in a transaction then the underlying connection should be same .

You can try this code 

  | InitialContext context = new InitialContext();
  | 	DataSource ds = (DataSource)context.lookup("java:XAOracleDS");
  | 	//UserTransaction utx = (UserTransaction)context.lookup("UserTransaction");
  | 	//utx.begin(); 
  | 	Connection con = ds.getConnection();
  | 	Connection con1 = ds.getConnection();
  | 	WrappedConnection wrap = (WrappedConnection)con;
  | 	WrappedConnection wrap1 = (WrappedConnection)con1;
  | 	out.println("UnderlyingConnection is :---> "+wrap.getUnderlyingConnection()+"<br>");
  | 	out.println("Underlying Connection "+wrap1.getUnderlyingConnection()+"<br>");
  | 	//utx.commit();
  | 	con.close();
  | 	con1.close();
  | 
In the above code the underlying connections would be different because the transaction related code is commented , if you uncomment that part it will give you same underlying connection.

So make sure that the part of code which is giving you different result is in transaction .



View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4104540#4104540

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4104540



More information about the jboss-user mailing list