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