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