/*
 * 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.
 */

/**
 * <p>
 *    Database Connection Pool API.
 * </p>
 *
 * <b>Overview in Dialog Form</b>
 * <p>
 *    Q: How do I use the DBCP package?
 * </p><p>
 *    A: There are two primary ways to access the DBCP pool, as a
 *    {@link java.sql.Driver Driver}, or as a {@link javax.sql.DataSource DataSource}.
 *    You'll want to create an instance of {@link org.apache.tomcat.dbcp.dbcp2.PoolingDriver} or
 *    {@link org.apache.tomcat.dbcp.dbcp2.PoolingDataSource}.  When using one of these
 *    interfaces, you can just use your JDBC objects the way you normally would.
 *    Closing a {@link java.sql.Connection} will simply return it to its pool.
 * </p>
 * <p>
 *    Q: But {@link org.apache.tomcat.dbcp.dbcp2.PoolingDriver PoolingDriver} and
 *    {@link org.apache.tomcat.dbcp.dbcp2.PoolingDataSource PoolingDataSource} both expect an
 *    {@link org.apache.tomcat.dbcp.pool2.ObjectPool ObjectPool} as an input.  Where do I
 *    get one of those?
 * </p><p>
 *    A: The {@link org.apache.tomcat.dbcp.pool2.ObjectPool ObjectPool} interface is defined
 *    in Commons Pool. You can use one of the provided implementations such as
 *    {@link org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool GenericObjectPool} or
 *    {@link org.apache.tomcat.dbcp.pool2.impl.SoftReferenceObjectPool SoftReferenceObjectPool}
 *    or you can create your own.
 * </p>
 * <p>
 *    Q: Ok, I've found an {@link org.apache.tomcat.dbcp.pool2.ObjectPool ObjectPool}
 *    implementation that I think suits my connection pooling needs.  But it wants
 *    a {@link org.apache.tomcat.dbcp.pool2.PooledObjectFactory PooledObjectFactory}.
 *    What should I use for that?
 * </p><p>
 *    A: The DBCP package provides a class for this purpose. It's called
 *    {@link org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory}.
 *    It implements the factory and lifecycle methods of
 *    {@link org.apache.tomcat.dbcp.pool2.PooledObjectFactory}
 *    for {@link java.sql.Connection}s.  But it doesn't create the actual database
 *    {@link java.sql.Connection}s itself, it uses a
 *    {@link org.apache.tomcat.dbcp.dbcp2.ConnectionFactory} for that.
 *    The {@link org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory} will take
 *    {@link java.sql.Connection}s created by the {@link org.apache.tomcat.dbcp.dbcp2.ConnectionFactory}
 *    and wrap them with classes that implement the pooling behaviour.
 * </p><p>
 *    Several implementations of {@link org.apache.tomcat.dbcp.dbcp2.ConnectionFactory} are
 *    provided--one that uses {@link java.sql.DriverManager} to create connections
 *    ({@link org.apache.tomcat.dbcp.dbcp2.DriverManagerConnectionFactory}),
 *    one that uses a {@link java.sql.Driver} to create connections
 *    ({@link org.apache.tomcat.dbcp.dbcp2.DriverConnectionFactory}),
 *    one that uses a {@link javax.sql.DataSource} to create connections
 *    ({@link org.apache.tomcat.dbcp.dbcp2.DataSourceConnectionFactory}).
 * </p>
 * <p>
 *    Q: I think I'm starting to get it, but can you walk me though it again?
 * </p><p>
 *    A: Sure.  Let's assume you want to create a {@link javax.sql.DataSource}
 *    that pools {@link java.sql.Connection}s.  Let's also assume that
 *    those pooled {@link java.sql.Connection}s should be obtained from
 *    the {@link java.sql.DriverManager}.
 *    You'll want to create a {@link org.apache.tomcat.dbcp.dbcp2.PoolingDataSource}.
 * </p><p>
 *    The {@link org.apache.tomcat.dbcp.dbcp2.PoolingDataSource} uses an underlying
 *    {@link org.apache.tomcat.dbcp.pool2.ObjectPool} to create and store its
 *    {@link java.sql.Connection}.
 * </p><p>
 *    To create a {@link org.apache.tomcat.dbcp.pool2.ObjectPool}, you'll need
 *    a {@link org.apache.tomcat.dbcp.pool2.PooledObjectFactory} that creates
 *    the actual {@link java.sql.Connection}s.  That's what
 *    {@link org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory} is for.
 * </p><p>
 *    To create the {@link org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory},
 *    you'll need at least two things:</p>
 *    <ol>
 *     <li>
 * A {@link org.apache.tomcat.dbcp.dbcp2.ConnectionFactory} from which
 * the actual database {@link java.sql.Connection}s will be obtained.
 *     </li>
 *     <li>
 * An empty and factory-less {@link org.apache.tomcat.dbcp.pool2.ObjectPool}
 * in which the {@link java.sql.Connection}s will be stored.
 * <br>
 * When you pass an {@link org.apache.tomcat.dbcp.pool2.ObjectPool} into the
 * {@link org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory}, it will
 * automatically register itself as the {@link org.apache.tomcat.dbcp.pool2.PooledObjectFactory}
 * for that pool.
 *     </li>
 *    </ol>
 * <p>
 *    In code, that might look like this:
 * </p>
 * <pre>GenericObjectPool connectionPool = new GenericObjectPool(null);
 * ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string", "username", "password");
 * PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
 * PoolingDataSource dataSource = new PoolingDataSource(connectionPool);</pre>
 * <p>
 *    To create a {@link org.apache.tomcat.dbcp.dbcp2.PoolingDriver}, we do the same thing,
 *    except that instead of creating a {@link javax.sql.DataSource} on the last line,
 *    we create a {@link org.apache.tomcat.dbcp.dbcp2.PoolingDriver}, and register the
 *    {@code connectionPool} with it.  E.g.,:</p>
 * <pre>GenericObjectPool connectionPool = new GenericObjectPool(null);
 * ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:some:connect:string", "username", "password");
 * PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
 * PoolingDriver driver = new PoolingDriver();
 * driver.registerPool("example",connectionPool);</pre>
 * <p>
 *    Since the {@link org.apache.tomcat.dbcp.dbcp2.PoolingDriver} registers itself
 *    with the {@link java.sql.DriverManager} when it is created, now you can just
 *    go to the {@link java.sql.DriverManager} to create your {@link java.sql.Connection}s,
 *    like you normally would:</p>
 * <pre>Connection conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:example");</pre>
 */
package org.apache.tomcat.dbcp.dbcp2;
