<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<html>
   <head>
      <title>Overview of the org.apache.commons.pool2 component</title>
   </head>
   <body>
      <p>
         Generic Object pooling API with several implementations.
      </p>
      <p>
         The <code>org.apache.commons.pool2</code> package defines a simple
         interface for a pool of object instances, and a handful of base
         classes that may be useful when creating pool implementations.
         The API supports pooling of unique objects which can be requested
         via a key as well as pools where all objects are equivalent.
      </p>
      <p>
         The <code>org.apache.commons.pool2.impl</code> package contains
         several pool implementations.
         {@link org.apache.commons.pool2.impl.GenericObjectPool
         GenericObjectPool} has many configuration options and can support
         a limited set of objects such as would be useful in a database
         connection pool.
         {@link org.apache.commons.pool2.impl.SoftReferenceObjectPool
         SoftReferenceObjectPool} has no limit on the number of objects in the
         pool, but the garbage collector can remove idle objects from the pool
         as needed.  There is also a keyed version of
         {@link org.apache.commons.pool2.impl.GenericObjectPool
         GenericObjectPool},
         {@link org.apache.commons.pool2.impl.GenericKeyedObjectPool
         GenericKeyedObjectPool}
      </p>
   </body>
</html>