/** Restores the delegation for the entire chain. */ private void clearXid() { _xid = null; UserPoolItem shareHead = _shareHead; _shareHead = null; ManagedPoolItem xaPtr = _xaNext; _xaHead = null; _xaNext = null; UserPoolItem assignedUserItem = null; for (UserPoolItem ptr = shareHead; ptr != null; ptr = ptr.getShareNext()) { if (ptr.getOwnPoolItem() == this) { assignedUserItem = ptr; break; } } for (UserPoolItem ptr = shareHead; ptr != null; ptr = ptr.getShareNext()) { if (assignedUserItem == null && ptr.getOwnPoolItem() == null) { ptr.associatePoolItem(this); assignedUserItem = ptr; } try { ptr.reassociatePoolItem(); } catch (Throwable e) { log.log(Level.WARNING, e.toString(), e); } } while (xaPtr != null) { ManagedPoolItem next = xaPtr._xaNext; xaPtr._xaNext = null; xaPtr._xaHead = null; xaPtr.clearXid(); xaPtr = next; } if (assignedUserItem != null) { // _shareHead = assignedUserItem; // _shareHead.setShareNext(null); } else if (_hasConnectionError) { destroy(); } else { toIdle(); } }
/** * Notifies that an application has closed the connection. * * <p>Remove and close the UserPoolItem associated with the PoolItem. If it's the last * UserPoolItem, move to the idle state. */ public void connectionClosed(ConnectionEvent event) { Object handle = event.getConnectionHandle(); if (!_hasConnectionError && handle == null && _shareHead != null) { log.fine( L.l( "JCA close event '{0}' for {1} did not have a connection handle. Please notify the JCA resource provider.", event, _mConn)); } UserPoolItem ptr = _shareHead; UserPoolItem prev = null; while (ptr != null) { UserPoolItem next = ptr.getShareNext(); Object userConn = ptr.getUserConnection(); if (userConn == handle || handle == null) { if (prev != null) prev.setShareNext(next); else _shareHead = next; ptr.close(); } else prev = ptr; ptr = next; } if (_shareHead == null) { toIdle(); return; } }
/** Closes the connection. */ void destroy() { ManagedConnection mConn = _mConn; _mConn = null; UserTransactionImpl transaction = _transaction; _transaction = null; if (mConn == null) return; _cm.removeItem(this, mConn); UserPoolItem userItem = _shareHead; if (log.isLoggable(Level.FINE)) log.fine("connection pool destroy " + this); try { while (userItem != null) { UserPoolItem next = userItem.getShareNext(); userItem.close(); userItem = next; } if (transaction != null) transaction.delistPoolItem(this, XAResource.TMFAIL); } catch (Throwable e) { log.log(Level.FINE, e.toString(), e); } try { mConn.destroy(); } catch (Exception e) { log.log(Level.FINE, e.toString(), e); } finally { _cm.getConnectionTimeProbe().end(_connectionStartTime); } }