You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sa...@apache.org on 2006/03/26 10:16:38 UTC
svn commit: r388885 - in
/jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite:
CompositeKeyedObjectPool.java CompositeObjectPool.java GrowManager.java
Author: sandymac
Date: Sun Mar 26 00:16:35 2006
New Revision: 388885
URL: http://svn.apache.org/viewcvs?rev=388885&view=rev
Log:
Changes neesed for "CompositeKeyedObjectPool"s to work:
Detect when making new objects is relatively slow or expensive.
When it is, try to anticipate demand and create idle objects
while allowing concurrent pool access. The idea came from a
discussion with Peter Steijn on ways to reduce pool latency.
Modified:
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeKeyedObjectPool.java
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeObjectPool.java
jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/GrowManager.java
Modified: jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeKeyedObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeKeyedObjectPool.java?rev=388885&r1=388884&r2=388885&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeKeyedObjectPool.java (original)
+++ jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeKeyedObjectPool.java Sun Mar 26 00:16:35 2006
@@ -100,6 +100,10 @@
if (pool == null) {
pool = poolFactory.createPool();
objectPools.put(key, pool);
+ // Tell CompositeObjectPools that we own them.
+ if (pool instanceof CompositeObjectPool) {
+ ((CompositeObjectPool)pool).setOwningCompositeKeyedObjectPool(this);
+ }
}
}
return pool;
Modified: jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeObjectPool.java?rev=388885&r1=388884&r2=388885&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeObjectPool.java (original)
+++ jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/CompositeObjectPool.java Sun Mar 26 00:16:35 2006
@@ -101,6 +101,11 @@
*/
private final CompositeObjectPoolFactory.FactoryConfig factoryConfig;
+ /**
+ * When not-<code>null</code> this pool is part of a {@link CompositeKeyedObjectPool}.
+ */
+ private CompositeKeyedObjectPool owningCompositeKeyedObjectPool = null;
+
CompositeObjectPool(final PoolableObjectFactory factory, final Manager manager, final Lender lender, final Tracker tracker, final boolean validateOnReturn) {
this(factory, manager, lender, tracker, validateOnReturn, null);
}
@@ -169,6 +174,25 @@
*/
List getPool() {
return pool;
+ }
+
+ /**
+ * Set the owner of this pool.
+ * @param ckop the owner of this pool
+ */
+ void setOwningCompositeKeyedObjectPool(final CompositeKeyedObjectPool ckop) {
+ if (owningCompositeKeyedObjectPool != null) {
+ throw new IllegalStateException("CompositeObjectPools cannot change ownership.");
+ }
+ owningCompositeKeyedObjectPool = ckop;
+ }
+
+ /**
+ * Get the owner of this pool or <code>null</code>.
+ * @return the owner of this pool or <code>null</code>
+ */
+ CompositeKeyedObjectPool getOwningCompositeKeyedObjectPool() {
+ return owningCompositeKeyedObjectPool;
}
/**
Modified: jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/GrowManager.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/GrowManager.java?rev=388885&r1=388884&r2=388885&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/GrowManager.java (original)
+++ jakarta/commons/proper/pool/trunk/src/java/org/apache/commons/pool/composite/GrowManager.java Sun Mar 26 00:16:35 2006
@@ -155,7 +155,14 @@
*/
private void schedulePrefill() {
if (objectPool.getLender().size() == 0 && isMakeObjectExpensive()) {
- PREFILL_TIMER.schedule(new PrefillTask(), 0L);
+ // When we are part of a CompositeKeyedObjectPool we need to pass the key to the Timer's thread.
+ final CompositeKeyedObjectPool ckop = objectPool.getOwningCompositeKeyedObjectPool();
+ if (ckop != null) {
+ final Object key = ckop.getKeys().get();
+ PREFILL_TIMER.schedule(new KeyedPrefillTask(key), 0L);
+ } else {
+ PREFILL_TIMER.schedule(new PrefillTask(), 0L);
+ }
}
}
@@ -174,6 +181,35 @@
}
} catch (Exception e) {
// swallowed
+ }
+ }
+ }
+
+ /**
+ * A <code>TimerTask</code> that will add another object if the pool is empty.
+ */
+ private class KeyedPrefillTask extends TimerTask {
+ private final Object key;
+
+ KeyedPrefillTask(final Object key) {
+ this.key = key;
+ }
+
+ public void run() {
+ ThreadLocal keys = null;
+ try {
+ if (objectPool.getNumIdle() == 0) {
+ keys = objectPool.getOwningCompositeKeyedObjectPool().getKeys();
+ keys.set(key);
+ objectPool.addObject();
+ }
+ } catch (Exception e) {
+ // swallowed
+ } finally {
+ // clear the key
+ if (keys != null) {
+ keys.set(null);
+ }
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org