132 lines
6.8 KiB
Java
132 lines
6.8 KiB
Java
/*
|
|
* 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;
|