From: Adrian B. <adr...@jb...> - 2005-12-19 20:20:43
|
User: adrian Date: 05/12/19 15:20:32 Modified: src/main/org/jboss/resource/connectionmanager Tag: Branch_4_0 InternalManagedConnectionPool.java JBossManagedConnectionPool.java Log: [JBAS-2578] - Use "putIfNotPresent" semantics for subpool construction. Change the internal managed connection pool to use 2 phase initialization. Add caching for subpool key hashCodes. Revision Changes Path No revision No revision 1.30.2.5 +9 -2 jbosscx/src/main/org/jboss/resource/connectionmanager/InternalManagedConnectionPool.java (In the diff below, changes in quantity of whitespace are not shown.) Index: InternalManagedConnectionPool.java =================================================================== RCS file: /cvsroot/jboss/jbosscx/src/main/org/jboss/resource/connectionmanager/InternalManagedConnectionPool.java,v retrieving revision 1.30.2.4 retrieving revision 1.30.2.5 diff -u -b -r1.30.2.4 -r1.30.2.5 --- InternalManagedConnectionPool.java 22 Nov 2005 00:10:41 -0000 1.30.2.4 +++ InternalManagedConnectionPool.java 19 Dec 2005 20:20:32 -0000 1.30.2.5 @@ -44,7 +44,7 @@ * * @author <a href="mailto:d_j...@us...">David Jencks</a> * @author <a href="mailto:ad...@jb...">Adrian Brock</a> - * @version $Revision: 1.30.2.4 $ + * @version $Revision: 1.30.2.5 $ */ public class InternalManagedConnectionPool { @@ -105,7 +105,7 @@ * @param poolParams the pooling parameters * @param log the log */ - public InternalManagedConnectionPool(ManagedConnectionFactory mcf, ConnectionListenerFactory clf, Subject subject, + protected InternalManagedConnectionPool(ManagedConnectionFactory mcf, ConnectionListenerFactory clf, Subject subject, ConnectionRequestInfo cri, PoolParams poolParams, Logger log) { this.mcf = mcf; @@ -118,6 +118,13 @@ this.trace = log.isTraceEnabled(); cls = new ArrayList(this.maxSize); permits = new FIFOSemaphore(this.maxSize); + } + + /** + * Initialize the pool + */ + protected void initialize() + { if (poolParams.idleTimeout != 0) IdleRemover.registerPool(this, poolParams.idleTimeout); } 1.31.2.11 +168 -72 jbosscx/src/main/org/jboss/resource/connectionmanager/JBossManagedConnectionPool.java (In the diff below, changes in quantity of whitespace are not shown.) Index: JBossManagedConnectionPool.java =================================================================== RCS file: /cvsroot/jboss/jbosscx/src/main/org/jboss/resource/connectionmanager/JBossManagedConnectionPool.java,v retrieving revision 1.31.2.10 retrieving revision 1.31.2.11 diff -u -b -r1.31.2.10 -r1.31.2.11 --- JBossManagedConnectionPool.java 22 Nov 2005 00:10:41 -0000 1.31.2.10 +++ JBossManagedConnectionPool.java 19 Dec 2005 20:20:32 -0000 1.31.2.11 @@ -21,11 +21,10 @@ */ package org.jboss.resource.connectionmanager; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.Iterator; +import java.util.Map; import javax.management.Notification; import javax.management.NotificationFilter; @@ -42,6 +41,7 @@ import org.jboss.logging.Logger; import org.jboss.mx.util.JMXExceptionDecoder; import org.jboss.resource.JBossResourceException; +import org.jboss.resource.connectionmanager.InternalManagedConnectionPool.PoolParams; import org.jboss.system.ServiceMBeanSupport; import org.jboss.tm.TransactionLocal; @@ -57,7 +57,7 @@ * * @author <a href="mailto:d_j...@us...">David Jencks</a> * @author <a href="mailto:ad...@jb...">Adrian Brock</a> - * @version $Revision: 1.31.2.10 $ + * @version $Revision: 1.31.2.11 $ */ public class JBossManagedConnectionPool extends ServiceMBeanSupport implements JBossManagedConnectionPoolMBean, NotificationListener @@ -277,13 +277,69 @@ flush(); } + public static class SubPoolContext + { + /** The subpool */ + private InternalManagedConnectionPool subPool; + + /** The track by transaction transaction local */ + private TransactionLocal trackByTx; + + /** + * Create a new SubPoolContext. + * + * @param tm the transaction manager + * @param mcf the managed connection factory + * @param clf the connection listener factory + * @param subject the subject + * @param cri the connection request info + * @param poolParams the pool parameters + * @param log the log + */ + public SubPoolContext(TransactionManager tm, ManagedConnectionFactory mcf, ConnectionListenerFactory clf, Subject subject, + ConnectionRequestInfo cri, PoolParams poolParams, Logger log) + { + subPool = new InternalManagedConnectionPool(mcf, clf, subject, cri, poolParams, log); + if (tm != null) + trackByTx = new TransactionLocal(tm); + } + + /** + * Get the sub pool + * + * @return the sub pool + */ + public InternalManagedConnectionPool getSubPool() + { + return subPool; + } + + /** + * Get the track by transaction + * + * @return the transaction local + */ + public TransactionLocal getTrackByTx() + { + return trackByTx; + } + + /** + * Initialize the subpool context + */ + public void initialize() + { + subPool.initialize(); + } + } + /** * The base pool implementation */ public abstract static class BasePool implements ManagedConnectionPool { /** The subpools */ - private final Map pools = new HashMap(); + private final Map subPools = new ConcurrentReaderHashMap(); /** The managed connection factory */ private final ManagedConnectionFactory mcf; @@ -297,9 +353,6 @@ /** Whether to use separate pools for transactional and non-transaction use */ private boolean noTxSeparatePools; - /** Track by connection by tx values */ - private final Map trackByTxPools = new ConcurrentReaderHashMap(); - /** The logger */ private final Logger log; @@ -343,22 +396,6 @@ this.clf = clf; } - /** - * Return the inuse count - * - * @return the count - */ - public int getInUseConnectionCount() - { - int count = 0; - synchronized (pools) - { - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - count += ((InternalManagedConnectionPool)i.next()).getConnectionInUseCount(); - } - return count; - } - public ConnectionListener getConnection(Transaction trackByTransaction, Subject subject, ConnectionRequestInfo cri) throws ResourceException { @@ -367,12 +404,12 @@ if (noTxSeparatePools) separateNoTx = clf.isTransactional(); Object key = getKey(subject, cri, separateNoTx); - InternalManagedConnectionPool mcp = getPool(key, subject, cri); + SubPoolContext subPool = getSubPool(key, subject, cri); + + InternalManagedConnectionPool mcp = subPool.getSubPool(); // Are we doing track by connection? - TransactionLocal trackByTx = null; - if (trackByTransaction != null) - trackByTx = (TransactionLocal) trackByTxPools.get(key); + TransactionLocal trackByTx = subPool.getTrackByTx(); // Simple case if (trackByTransaction == null || trackByTx == null) @@ -464,13 +501,35 @@ dump("Returning connection to pool " + cl); } + /** + * Return the inuse count + * + * @return the count + */ + public int getInUseConnectionCount() + { + int count = 0; + synchronized (subPools) + { + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) + { + SubPoolContext subPool = (SubPoolContext) i.next(); + count += subPool.getSubPool().getConnectionInUseCount(); + } + } + return count; + } + public int getConnectionCount() { int count = 0; - synchronized (pools) + synchronized (subPools) + { + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) { - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - count += ((InternalManagedConnectionPool)i.next()).getConnectionCount(); + SubPoolContext subPool = (SubPoolContext) i.next(); + count += subPool.getSubPool().getConnectionCount(); + } } return count; } @@ -478,10 +537,13 @@ public int getConnectionCreatedCount() { int count = 0; - synchronized (pools) + synchronized (subPools) { - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - count += ((InternalManagedConnectionPool)i.next()).getConnectionCreatedCount(); + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) + { + SubPoolContext subPool = (SubPoolContext) i.next(); + count += subPool.getSubPool().getConnectionCreatedCount(); + } } return count; } @@ -489,10 +551,13 @@ public int getConnectionDestroyedCount() { int count = 0; - synchronized (pools) + synchronized (subPools) { - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - count += ((InternalManagedConnectionPool)i.next()).getConnectionDestroyedCount(); + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) + { + SubPoolContext subPool = (SubPoolContext) i.next(); + count += subPool.getSubPool().getConnectionDestroyedCount(); + } } return count; } @@ -500,12 +565,15 @@ public long getAvailableConnectionCount() { long count = 0; - synchronized (pools) + synchronized (subPools) { - if (pools.size() == 0) + if (subPools.size() == 0) return poolParams.maxSize; - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - count += ((InternalManagedConnectionPool)i.next()).getAvailableConnections(); + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) + { + SubPoolContext subPool = (SubPoolContext) i.next(); + count += subPool.getSubPool().getAvailableConnections(); + } } return count; } @@ -513,31 +581,40 @@ public int getMaxConnectionsInUseCount() { int count = 0; - synchronized (pools) + synchronized (subPools) + { + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) { - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - count += ((InternalManagedConnectionPool)i.next()).getMaxConnectionsInUseCount(); + SubPoolContext subPool = (SubPoolContext) i.next(); + count += subPool.getSubPool().getMaxConnectionsInUseCount(); + } } return count; } public void shutdown() { - synchronized (pools) + synchronized (subPools) { - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - ((InternalManagedConnectionPool)i.next()).shutdown(); - pools.clear(); + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) + { + SubPoolContext subPool = (SubPoolContext) i.next(); + subPool.getSubPool().shutdown(); + } + subPools.clear(); } } public void flush() { - synchronized (pools) + synchronized (subPools) + { + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) { - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - ((InternalManagedConnectionPool)i.next()).shutdown(); - pools.clear(); + SubPoolContext subPool = (SubPoolContext) i.next(); + subPool.getSubPool().shutdown(); + } + subPools.clear(); } } @@ -546,10 +623,13 @@ */ protected void shutdownWithoutClear() { - synchronized (pools) + synchronized (subPools) + { + for (Iterator i = subPools.values().iterator(); i.hasNext(); ) { - for (Iterator i = pools.values().iterator(); i.hasNext(); ) - ((InternalManagedConnectionPool)i.next()).shutdownWithoutClear(); + SubPoolContext subPool = (SubPoolContext) i.next(); + subPool.getSubPool().shutdown(); + } } } @@ -573,26 +653,28 @@ * @param key the key to the pool * @param subject the subject of the pool * @param cri the connection request info - * @return the pool + * @return the subpool context * @throws ResourceException for any error */ - private InternalManagedConnectionPool getPool(Object key, Subject subject, ConnectionRequestInfo cri) - throws ResourceException - { - InternalManagedConnectionPool mcp = null; - synchronized (pools) + private SubPoolContext getSubPool(Object key, Subject subject, ConnectionRequestInfo cri) throws ResourceException { - mcp = (InternalManagedConnectionPool) pools.get(key); - if (mcp == null) + SubPoolContext subPool = (SubPoolContext) subPools.get(key); + if (subPool == null) { - mcp = new InternalManagedConnectionPool(mcf, clf, subject, cri, poolParams, log); - pools.put(key, mcp); TransactionManager tm = getTransactionManager(); - if (tm != null) - trackByTxPools.put(key, new TransactionLocal(tm)); + subPool = new SubPoolContext(tm, mcf, clf, subject, cri, poolParams, log); + synchronized (subPools) + { + if (subPools.containsKey(key)) + subPool = (SubPoolContext) subPools.get(key); + else + { + subPool.initialize(); + subPools.put(key, subPool); } } - return mcp; + } + return subPool; } /** @@ -652,6 +734,9 @@ /** The connection request information */ private final Object cri; + /** The cached hashCode */ + private int hashCode = Integer.MAX_VALUE; + /** Separate no tx */ private boolean separateNoTx; @@ -664,7 +749,9 @@ public int hashCode() { - return SubjectActions.hashCode(subject) ^ cri.hashCode(); + if (hashCode == Integer.MAX_VALUE) + hashCode = SubjectActions.hashCode(subject) ^ cri.hashCode(); + return hashCode; } public boolean equals(Object obj) @@ -715,6 +802,9 @@ /** Separate no tx */ private boolean separateNoTx; + /** The cached hashCode */ + private int hashCode = Integer.MAX_VALUE; + SubjectKey(Subject subject, boolean separateNoTx) { this.subject = (subject == null)? NOSUBJECT:subject; @@ -723,7 +813,9 @@ public int hashCode() { - return SubjectActions.hashCode(subject); + if (hashCode == Integer.MAX_VALUE) + hashCode = SubjectActions.hashCode(subject); + return hashCode; } public boolean equals(Object obj) @@ -744,7 +836,6 @@ public static class PoolByCri extends BasePool { - public PoolByCri(final ManagedConnectionFactory mcf, final InternalManagedConnectionPool.PoolParams poolParams, final boolean noTxSeparatePools, @@ -773,6 +864,9 @@ /** Separate no tx */ private boolean separateNoTx; + /** The cached hashCode */ + private int hashCode = Integer.MAX_VALUE; + CriKey(ConnectionRequestInfo cri, boolean separateNoTx) { this.cri = (cri == null)? NOCRI:cri; @@ -781,7 +875,9 @@ public int hashCode() { - return cri.hashCode(); + if (hashCode == Integer.MAX_VALUE) + hashCode = cri.hashCode(); + return hashCode; } public boolean equals(Object obj) |