/** Allocates a connection. */
  private Object allocateConnection(
      ManagedConnectionFactory mcf, Subject subject, ConnectionRequestInfo info)
      throws ResourceException {
    UserPoolItem userPoolItem = null;

    try {
      while (true) {
        userPoolItem = null;
        UserTransactionImpl transaction = _tm.getUserTransaction();

        if (transaction != null) userPoolItem = allocateShared(transaction, mcf, subject, info);

        if (userPoolItem == null) userPoolItem = allocatePoolConnection(mcf, subject, info, null);

        Object userConn;

        userConn = userPoolItem.allocateUserConnection();

        if (userConn != null) {
          userPoolItem = null;
          return userConn;
        }

        userPoolItem.close();
      }
    } finally {
      if (userPoolItem != null) userPoolItem.close();
    }
  }