Monday, 20 February 2017

What is connection pooling in java ? explain with example ?



Connection Pool Example

Code Snippet –
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
 * @author Manoj
 */
public class ConnectionPool {

       private BlockingQueue<Connection> connectionPoolQueue;
       private int maximumPoolSize;
       private int initialPoolSize;
       private int currentPoolSize;

       private String dbUrl;
       private String dbUser;
       private String dbPassword;

       public ConnectionPool(int maxPoolSize, int initialPoolSize, String url, String username, String password,
                     String driverClassName) throws ClassNotFoundException, SQLException {

              if ((initialPoolSize > maxPoolSize) || initialPoolSize < 1 || maxPoolSize < 1) {
                     throw new IllegalArgumentException("Invalid pool size parameters");
              }

              this.maximumPoolSize = maxPoolSize > 0 ? maxPoolSize : 10;
              this.initialPoolSize = initialPoolSize;
              this.dbUrl = url;
              this.dbUser = username;
              this.dbPassword = password;
              this.connectionPoolQueue = new LinkedBlockingQueue<Connection>(maxPoolSize);
              initializeConnectionPool(driverClassName);
       }

       private void initializeConnectionPool(String driverClassName) throws ClassNotFoundException, SQLException {
              Class.forName(driverClassName);
              for (int i = 0; i < initialPoolSize; i++) {
                     openAndPoolConnection();
              }
       }

       private synchronized void openAndPoolConnection() throws SQLException {
              if (currentPoolSize == maximumPoolSize) {
                     return;
              }

              Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
              connectionPoolQueue.offer(new PooledConnection(conn, this));
              currentPoolSize++;
       }

       public Connection borrowConnection() throws InterruptedException, SQLException {
              if (currentPoolSize < maximumPoolSize) {
                     openAndPoolConnection();
              }
              return connectionPoolQueue.take();
       }

       public void surrenderConnection(Connection conn) {
              if (!(conn instanceof PooledConnection)) {
                     return;
              }
              connectionPoolQueue.offer(conn);
       }
}

In above code PooledConnection.java is an implementation of Connection interface
Code Snippet-
public class PooledConnection implements Connection {

    private Connection coreConnection;
    private ConnectionPool connectionPool;

    public PooledConnection(Connection coreConnection, ConnectionPool connectionPool) {
        this.connectionPool = connectionPool;
        this.coreConnection = coreConnection;
    }

    @Override
    public void close() throws SQLException {
        connectionPool.surrenderConnection(this);
    }

…….. all default method implementation of Connection interface…

Please refer below link for more details:
https://github.com/sharmaak/crashlabs/tree/master/MinimalConnectionPool/com/amitcodes/dbcp

1 comment: