Friday, April 12, 2013

Use Apache DBCP with Core Java


Apache DBCP : 

Many Apache projects support interaction with a relational database. Creating a new connection for each user can be time consuming (often requiring multiple seconds of clock time), in order to perform a database transaction that might take milliseconds. Opening a connection per user can be unfeasible in a publicly-hosted Internet application where the number of simultaneous users can be very large. Accordingly, developers often wish to share a "pool" of open connections between all of the application's current users. The number of users actually performing a request at any given time is usually a very small percentage of the total number of active users, and during request processing is the only time that a database connection is required. The application itself logs into the DBMS, and handles any user account issues internally.
There are several Database Connection Pools already available, both within Apache products and elsewhere. This Commons package provides an opportunity to coordinate the efforts required to create and maintain an efficient, feature-rich package under the ASF license.
The commons-dbcp package relies on code in the commons-pool package to provide the underlying object pool mechanisms that it utilizes.
DBCP now comes in two different versions, one to support JDBC 3 and one to support JDBC 4. Here is how it works:
  • DBCP 1.4 compiles and runs under JDK 1.6 only (JDBC 4)
  • DBCP 1.3 compiles and runs under JDK 1.4-1.5 only (JDBC 3)

Requirements : 

  • Download jars of DBCP commons-dbcp.jar and commons-pool.jar from here.
  • download Database dirver (in this example , we use MySQL so download mysql-connector-java-5.1.13-bin.jar) 

DbcpTest.java : 

import java.sql.Connection;
import java.sql.SQLException;

import javax.activation.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;

public class DbcpTest{
private static String connectURI = "jdbc:mysql://localhost/dbcp_test";
private static Connection conn;
private static ConnectionFactory connectionFactory;
private static ObjectPool connectionPool;
private static PoolingDataSource dataSource;
static {
try{
Class.forName("com.mysql.jdbc.Driver");
connectionFactory = new DriverManagerConnectionFactory(connectURI, "root","");
connectionPool = new GenericObjectPool<>();
new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false,true);
dataSource = new PoolingDataSource(connectionPool);
}catch(ClassNotFoundException ex){
System.out.println(ex.getMessage());
}
}
@Override
public void shutdownDatasource(DataSource ds) {
try{
BasicDataSource bds = (BasicDataSource) ds;
bds.close();
}catch(SQLException ex){
System.out.println(ex.getMessage());
}
}

@Override
public Connection getConnection() {
try{
conn = dataSource.getConnection();
if(conn != null){
return conn;
}else{
return null;
}
}catch(SQLException ex){
System.out.println(ex.getMessage());
return null;
}
}
}

When the code is compile ,with the help of getConnection() method , we get the Connection object and perform action .