Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Пример реализации Connection Pool


Автор: AntonSaburov 22.2.2005, 14:03
Общая идея пула коннектов к базе данных состоит в том, чтобы заранее иметь несколько открытых коннектов, дабы не тратить времяна их открытие. Пул таким образом позволяет повысить скорость работы системы.

Код

import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Название говорит само за себя.
 */
final class ConnectionPool {
    private Connection[] c;//массив подключений
    private Statement[] s;//массив утверждений
    private boolean[] b;//флаги занятости утверждений
    private int size;//размер масиивов
    //переменные чтоб в методах не создавать
    private int i;//индекс массивов
//----Конструктор-------------------------------------------------------
    private ConnectionPool(String driver, String url, String user,
                           String password, int _size)
            throws ClassNotFoundException, SQLException {
        size=_size;
        c=new Connection[size];
        s=new Statement[size];
        b=new boolean[size];
        Class.forName(driver);
        int i;
        for(i=0;i<size;i++){
            c[i]=DriverManager.getConnection(url,user,password);
            s[i]=c[i].createStatement();
            b[i]=false;
        }
    }
//----Метод создания объекта--------------------------------------------
    final ConnectionPool getInstance(String driver, String url,
                                     String user, String password,
                                     int size){
        try{
            Class.forName(driver);
        }catch(ClassNotFoundException e1){
            return null;
        }
        try{
            Connection c=DriverManager.getConnection(url,user,password);
            Statement s=c.createStatement();
            s.close();
            c.close();
        }catch(SQLException e2){
            return null;
        }
        try{
            ConnectionPool cp=new ConnectionPool(driver, url, user,
                    password, size);
            return cp;
        }catch(ClassNotFoundException e1){
            return null;
        }catch(SQLException e2){
            return null;
        }
    }
//----Метод захвата утверждения-----------------------------------------
    final synchronized Statement getStatement(){
        for(i=0;i<size;i++){
            if(!b[i]){
                b[i]=true;
                return s[i];
            }
        }
        return null;
    }
//----Метод освобождения утверждения------------------------------------
    final synchronized boolean getBack(Statement _s){
        for(i=0;i<size;i++){
            if(s[i]==_s){
                b[i]=false;
                return true;
            }
        }
        return false;
    }
//----Метод для закрытия пула-------------------------------------------
    final synchronized boolean close(){
        for(i=0;i<size;i++){
            if(b[i]){
                return false;
            }
        }
        boolean error=false;
        for(i=0;i<size;i++){
            try{
                s[i].close();
            }catch(SQLException e1){
                error=true;
            }
            try{
                c[i].close();
            }catch(SQLException e2){
                error=true;
            }
        }
        return !error;
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)