Commons Pool
------------

The Commons Pool project is built around a single idea - the creation of an ``ObjectPool``. This page captures our "best practices" discovered over the course of building the GeoTools project.

References:

* http://commons.apache.org/pool/

ObjectPool as a Cache
^^^^^^^^^^^^^^^^^^^^^

You can configure an ``SoftReferenceObjectPool`` to use weak references, the result functions the same as a cache.

ObjectPool for Interning
^^^^^^^^^^^^^^^^^^^^^^^^

You can configure an ``ObjectPool`` to use weak references in order to "Intern" objects and prevent duplicates from being
used in your application.

ObjectPool as a Pool
^^^^^^^^^^^^^^^^^^^^

First comes the set up - so the object pool can create the objects as needed.::
  
  public interface KeyedPoolableObjectFactory {
    Object makeObject(Object key);
    void activateObject(Object key, Object obj);
    void passivateObject(Object key, Object obj);
    boolean validateObject(Object key, Object obj);
    void destroyObject(Object key, Object obj);
  }

ObjectPool Configuration
''''''''''''''''''''''''

And then comes the configuration (of ``GenericKeyedObjectPool`` ):


* Number of Objects
  
  ``maxActive``
    capacity of created objects
  
  ``maxIdle``
    maximum number of lurkers

* What to do when at capacity:
  
  ``whenExhausedAction``
     fail, grow or block when capacity reached
  
* When to check objects in pool
  
  ``testOnBorrow``
    Check with ``validateObject`` when borrowed
  
  ``testOnreturn``
    Check with ``validateObject`` when returned
  
  ``testWhenIdle``
    Check with ``validateObject`` from the eviction thread

* Eviction Thread
  
  ``timeBetweenEvictionRunsMillis``
    Time to sleep
  
  ``minEvictableIdleTimeMills``
    time to wait before an object could be cleaned up

The way it works is this, for a ``maxActive`` of 20 at most 20 objects will be created. If they are all returned the pool will throw the instances away until it has ``maxIdle`` (this is kind of its comfort zone). After this point each object will have to time out (based on ``minEvictableIdleTimeMills``) before it is reclaimed.::
      
      maxActive
   /--This is the absolute capacity of our ``ObjectCache``
   |
   |  Objects are immediately evicted when they are not in use
   |
   \-> ``maxIdle``
   /-- This is the "comfort zone" that your ``ObjectCache`` will try for under heavy use
   |
   |  Objects are evicted when they have not been used, every ``minEvictableIdleTimeMills`` 
   |
   \-> Empty

Eviction
''''''''

Here is how eviction works:

1. it will grab ``numTestsPerEvictionRun`` objects from the pool
2. for any object that has exceeded ``minEvictableIdleTimeMillis`` it will call
   ``validateObject``
3. it will throw away any object that fails the ``validateObject`` test
4. If we have less than ``minIdle`` left in the pool new objects will be spawned

You can perform eviction in a thread controlled by setting ``testWhenIdle`` and providing a value for ``timeBetweenEvictionRunsMillis``.

GenericObjectPool Configuration
'''''''''''''''''''''''''''''''

``GenericObjectPool`` introduces the concept of a "soft min" operating as a preferred number object objects to hold in reserved (even when we are completely idle).

This concept is a little freaky in that it looks like the ``GenericObjectPool`` will create these objects in a background thread even if nothing is going on.

``minIdle``
   minimum number of lurkers

``softMinEvictableIdleTimeMills``
   time to wait before an object is cleaned up

The way it works is this, for a ``maxActive`` of 20 at most 20 objects will be created. If they are all returned the pool will throw the instances away until it has ``maxIdle`` (this is kind of its comfort zone). As each object times out we will be left with ``minIdle`` number of objects in the pool.::
    
      maxActive
   /--This is the absolute capacity of our ``ObjectCache``
   |
   |  Objects are immediately evicted when they are not in use
   |
   \-> ``maxIdle``
   /-- This is the "comfort zone" that your ``ObjectCache`` will try for under heavy use
   |
   |  Objects are evicted when they have not been used, every ``minEvictableIdleTimeMills`` 
   |
   \-> ``minIdle``
   /-> This is the number of Objects reserved when we are completely idle
   |
   | Objects are spawned as needed, every ``softMinEvictableIdleTimeMills``
   |
   \-- Empty
