oi Kleber,

quando usei uma pequena aplicacao de servlets, criei uma "connection pooling", muito simples, mas que funcionou. Envio a classe

Na classe que eu estou precisando de uma conexao:

Con = Conexao.getInstancia();
Conn = Con.getCon(); // pega uma conexao
//executo o SQL
Con = Con.setCon(Conn); //devolve a conexao


Veja aí e me mande um retorno.
Ps. Algumas coisas tem que ser alteradas, pois na época que fiz nao tinha alguns conhecimentos....

[]'s

Era isso que vc queria?



import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.lang.Integer;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Vector;



/**
* Esta é a classe responsável por todas as conexoes peristentes
* no arquivo geral.properties deve-se colocar os atributos:
* jdbc.min = com o número mínimo de conxões. Ex.: 3
* jdbc.max = O número máximo de conexões. Ex. 20
* jdbc.databaseURL = a URL do banco de dados. Ex.: jdbc:interbase://almoxarifado/ALMOXARIFADO.GBD
* jdbc.driverName = o nome do driver do banco de dados. Ex.: interbase.interclient.Driver
* Esta classe deve ser acessada pelo método getInstancia, para pegar o único objeto que
* pode existir apartir desta classe e os métodos getCon e setCon para pegar e devolver Conexoes
* respectivamente
         * Ex.:        
         *            Connection Conn;
          *          try {
          *                   Conn = Con.getCon();
         *                        Con = Con.setCon(Conn);
          *                  } catch(InterruptedException IE) {
           *                  System.out.println("teste - erro ao devolver o obj");
         *                }
*
*/
public class Conexao{

        // Variável para conservar o objeto do tipo Conexao na memória e ser chamado apenas uma vez
        private static Conexao Con;
        // O número mínimo de conexões
        private static int min;
        // O número máximo de conexões
        private static int max;
        // a URL do banco de dados
        private static String databaseURL;
        // O driver usado pelo banco
        private static String driverName;
        // armazenará as conexões
        private static Vector vet;
        //o número total de conexoes ja abertas ate agora
        private static int nConTotal;
        private final static String LOGIN          = "SYSDBA";
        private final static String PASSWORD = "nenhumasenha";
        // setado com true caso ocorra erro na conexao
        private static boolean flagErroConexao = false;
        // setado com a descricao do erro
        public static String msgErroConexao;

         /**
         * Este é o método inicial desta classe, funciona como se fosse um construtor
         * Todas as classes externas devem chamá-lo
         * Ele só deixa existir um objeto desta classe
         * ATENÇÃO - Apenas UM objeto é criado a partir desta classe
    * @return Conexao - O próprio objeto do tipo desta classe.
         */
        public static Conexao getInstancia() {
                if (Con == null) {
                        System.out.println("Conexao - Executando pela primeira vez");
                    Con = new Conexao();
                }
                return Con;
        } // fim getInstancia
       
                 /**
         * Este é o método inicial desta classe, funciona como se fosse um construtor
         * Todas as classes externas devem chamá-lo
         * Ele só deixa existir um objeto desta classe
         * ATENÇÃO - Apenas UM objeto é criado a partir desta classe
         * @param ncon Inteiro-  o número de conexões a serem abertas, esse paramatro substitui o do arquivo.
         * geralmente usado para teste
    * @return Conexao - O próprio objeto do tipo desta classe.
         */
        public static Conexao getInstancia(int ncon) {
                if (Con == null) {
                        System.out.println("Conexao - Executando pela primeira vez");
                    Con = new Conexao(ncon);
                }
                return Con;
        } // fim getInstancia
       
               
         /**
         * Devolve uma conexao colocando-a no array
         * Lembre-se sempre de devolver as conexoes
         * e que quem deve devolver é o objeto Conexao
         * Ex.:        
         *            Connection Conn;
          *          try {
          *                   Conn = Con.getCon();
         *                        Con = Con.setCon(Conn);
          *                  } catch(InterruptedException IE) {
           *                  System.out.println("teste - erro ao devolver o obj");
         *                }
    * @param C a Connection que estava emprestada
    * @return null sempre ira retornar nulo para a variavel que o chamou ser retirada da
    * memória
         */
        public synchronized Conexao setCon(Connection C) {
                vet.add(C);  
                notifyAll(); //avisa as thread para acordarem
                return null;
        } //Fim setCon


         /**
         * Pega uma conexao, retirando-a do array
         * Ex.:        
         *            Connection Conn;
          *          try {
          *                   Conn = Con.getCon();
         *                        Con = Con.setCon(Conn);
          *                  } catch(InterruptedException IE) {
           *                  System.out.println("teste - erro ao devolver o obj");
         *                }
    * @return Connection a conexao que será usada
    * @throws InterruptedException
         */
        public synchronized Connection getCon() throws InterruptedException {
               
                if (flagErroConexao)
                        return null;
                if ( (!(vet.isEmpty())) && (vet.size() != 0) )
                                        return (Connection) vet.remove(0);
                else
                        if ( (vet.size() != max) && (nConTotal != max) ) {
                                abreConnection();
                                nConTotal++;
                                return (Connection) vet.remove(0);
                        }
                        else {
                                wait(); //guarda até que o método notifyAll() ou notify() seja chamado
                                return getCon();
                        }
        } //fim getCon

        static {
                try {
                 min         = Integer.parseInt(func.getProperties("geral").getProperty("jdbc.min"));
                         max         = Integer.parseInt(func.getProperties("geral").getProperty("jdbc.max"));
                         databaseURL = func.getProperties("geral").getProperty("jdbc.databaseURL");
                         driverName  = func.getProperties("geral").getProperty("jdbc.driverName");
      } catch (FileNotFoundException e) {
      System.out.println(e.toString());
      } catch (IOException e) {
      System.out.println(e.toString());
      }
   }  //fim bloco static


        /** Construtor privado, pois só deve ser chamado uma vez por getInstancia()
        * Este construtor inicaliza o vetor de conexoes e as poe dentro
        */
        private Conexao(){
                //obriga a rodar o método finalize()
                System.runFinalization();
                // cria o vetor de conexoes
                vet = new Vector(min, 2);
                System.out.println("Conexao - Abrindo conexoes. Aguarde ...");
                abreTodasConnection();
                if (!(flagErroConexao))
                        System.out.println ("Conexao - Conexoes estabelecidas total= " + min);        
                else {
                        System.out.println ("Conexao - Nenhuma conexao foi estabelecida devido a um erro");        
                        vet = null;
                }
                                       
        } //fim const conexao
       
        /** Construtor privado, pois só deve ser chamado uma vez por getInstancia()
        * Este construtor inicaliza o vetor de conexoes e as poe dentro
        */
        private Conexao(int ncon){
                min = ncon;
                //obriga a rodar o método finalize()
                System.runFinalization();
                // cria o vetor de conexoes
                vet = new Vector(min, 2);
                System.out.println("Conexao - Abrindo conexoes. Aguarde ...");
                abreTodasConnection();
                if (!(flagErroConexao))
                        System.out.println ("Conexao - Conexoes estabelecidas total= " + min);        
                else
                        System.out.println ("Conexao - Nenhuma conexao foi estabelecida devido a um erro");        
        } //fim const conexao
       
        /**
        * abre uma conexoes
        * @throws ClassNotFoundException
        * @throws java.sql.SQLException
        */
        private synchronized static void abreConnection() {
                try {
                     Class.forName (driverName);
           } catch(ClassNotFoundException e) {
             System.out.println("Conexao - Erro " + e);
                }
                try{
                        vet.addElement(DriverManager.getConnection (databaseURL, LOGIN, PASSWORD));
                } catch(SQLException e)        {
                        flagErroConexao = true;
                        msgErroConexao = e.toString();
                        System.out.println("Conexao - Erro: "+ e);
                }
        } //fim abreConexoes
       
        /**
        * abre TODAS conexoes até o número mímino definido em min
        * @throws ClassNotFoundException
        * @throws java.sql.SQLException
        */
        private synchronized static void abreTodasConnection() {
                                for (int i=0 ; i< min; i++) {
                                        System.out.print(i+"-");
                                        abreConnection();
                                }
                                nConTotal = min;
                                System.out.println("");
        } //fim abreTodasConexoes
       

        /**
        * fecha todas as conexoes existentes retirando-as do vetor
        * @throws java.sql.SQLException
        */
        private synchronized static void fechaConnection() {
                while ( !(vet.isEmpty()) ) {
                                Connection com = (Connection) vet.remove(0);
                                try {
                                        com.close();
                                        com = null;
                                } catch(SQLException e) {
                                        System.out.println("Conexao - Erro ao fechar conexão: " + e);
                                }
                } //fim while

        } // fim fechaConnection

         /**
         * método finalize é chamado momentos antes do objeto deixar a memória
    * Este método é usado para fechar as conexoes
    * Este método sobrepoe da classe Object
    * @return void - Sem Retorno
    * @see java.lang.Object#finalize()
         */
        protected void finalize() throws Throwable {
                 System.out.println("Conexao - Fechando as conexões. Aguarde ... ");
                fechaConnection();
                System.out.println("Conexao - Conexões fechadas com exito ");
        }

}// Fim aux

Atenciosamente
PAULO BRANCO
DIRETIVA DIGITAL



Kleber Rodrigo Carvalho <[EMAIL PROTECTED]>

02/05/2002 15:55
Please respond to java-list

       
        To:        [EMAIL PROTECTED], [EMAIL PROTECTED]
        cc:        
        Subject:        [java-list] Connection Pooling




PessoALL

Estou tentando construir um pool de conexão aqui, mas
de cara entrei neste site da sun, baixei os exemplos e
na hora de compilar ele dá erro.
Estou usando o jdk 1.3.1.

http://developer.java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html

Pq será o erro ?
Este pool é uma bom exemplo para se usar no dia a dia
?

Obrigado
Kleber Rodrigo de Carvalho

ps.: Desculpa pelo anexo


__________________________________________________
Do You Yahoo!?
Yahoo! Health - your guide to health and wellness
http://health.yahoo.com------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------


Attachment: pool.zip
Description: Zip archive

------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------


Responder a