Pool DBCP[RESOLVIDO]

Segue o código corrigido pelo Vinny, espero que ajude muitas pessoas :slight_smile:

package dao;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
import util.ArquivosUtil;//Classe de uso interno (realiza o log. colocar sua classe de log no lugar)
import util.DiversosUtil;//Classe de uso interno (possui um método para pegar o stakestrace da exception)

/**
 * Arquivo criado em: 23/09/2010
 * @author Laudelino Martins Cardoso Neto
 */
public class PoolConnectionDB {
    
    private Properties props;

    private BasicDataSource dataSource;

    public PoolConnectionDB() {
        this.carregarConfiguracoesBd();//Carrega as configs do bd a partir de arquivos
        this.configurarDataSourceRAC();//Configura o BasicDataSource
    }


    /**
     * Método que carrega os dados de acesso ao banco a partir de um
     * arquivo properties
     */
    private void carregarConfiguracoesBd(){
        try{
            String caminhoBanco = ArquivosUtil.getCaminhoAplicacao()+"/conexao.properties";
            File file = new File(caminhoBanco);
            FileInputStream fis = null;
            this.props = new Properties();
            fis = new FileInputStream(file);
            props.load(fis);
        }catch(IOException ex){
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
    }

    /**
     * Método que configura um BaseDataSource com uma conexão ativa (pode ser aumentado)
     */
    private void configurarDataSourceRAC(){
        this.dataSource = new BasicDataSource();
        this.dataSource.setDriverClassName(props.getProperty("nome_driver"));
        this.dataSource.setUsername(props.getProperty("usuario"));
        this.dataSource.setPassword(props.getProperty("senha"));
        this.dataSource.setUrl(props.getProperty("url_conexao"));
        this.dataSource.setInitialSize(1);//Seta o pool para apenas uma conexão ativa
        this.dataSource.setMinIdle(1);//Obriga o pool a ter pelo menos uma conexão sempre ativa
        this.dataSource.setTestOnReturn(true);//Habilita o teste da conexão antes de retorná-la
        this.dataSource.setValidationQuery("SELECT sysdate FROM dual");//Query que serve para atestar conectividade (para oracle)
    }

    /**
     * Método que retorna uma conexão do BasicDataSource.
     * Nesse caso ele verifica se existe uma conexão pronta, senão existir verifica
     * se o número de conexões está abaixo do que foi estabelecido, se estiver cria
     * a conexão e devolve.
     * @return Uma conexão do pool
     */
    public Connection getConexaoRAC(){

        try{            
            return dataSource.getConnection();
        }catch (SQLException sqle){
            sqle.printStackTrace();
            ArquivosUtil.gravarLog(DiversosUtil.getMensagemExcecao(sqle), ArquivosUtil.LOG_TIPO_ERRO);
        }catch (Exception e){
            e.printStackTrace();
            ArquivosUtil.gravarLog(DiversosUtil.getMensagemExcecao(e), ArquivosUtil.LOG_TIPO_ERRO);
        }

        return null;

    }

    /**
     * Mostra informações do DataSource
     */
    public void showStatusDataSource(){
        System.out.println("Conexões ativas: "+dataSource.getNumActive());
        System.out.println("Conexões inativas: "+dataSource.getNumIdle());
    }

    /**
     * Fecha tudo o que foi usado pelos DAO's incluindo a conexão.
     * Nesse caso a conexão não é fechada de fato como no JDCB puro, e sim devolvida
     * ao pool de conexão (BasicDataSource)
     * @param rs ResultSet
     * @param ps PreparedStatement
     * @param conn Connection (oriunda do BasicDataSource, mas pode ser a do JDBC também)
     */
    public static void liberarRecursosBD(ResultSet rs, PreparedStatement ps, Connection conn){
        try{
            if (ps != null)
            ps.close();
            if (rs != null)
                rs.close();
            if (conn != null)
                conn.close();
        }catch (SQLException sqle){
            sqle.printStackTrace();
            ArquivosUtil.gravarLog(DiversosUtil.getMensagemExcecao(sqle), ArquivosUtil.LOG_TIPO_ERRO);
        }catch (Exception e){
            e.printStackTrace();
            ArquivosUtil.gravarLog(DiversosUtil.getMensagemExcecao(e), ArquivosUtil.LOG_TIPO_ERRO);
        }

    }

}//Fim da classe PoolConnectionDB

Novamente agradeço pelo Vinny pela ajuda :slight_smile:

[quote=laudenpower]Segue o código corrigido pelo Vinny, espero que ajude muitas pessoas :slight_smile:

package dao;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp.BasicDataSource;
import util.ArquivosUtil;//Classe de uso interno (realiza o log. colocar sua classe de log no lugar)
import util.DiversosUtil;//Classe de uso interno (possui um método para pegar o stakestrace da exception)

/**
 * Arquivo criado em: 23/09/2010
 * @author Laudelino Martins Cardoso Neto
 */
public class PoolConnectionDB {
    
    private Properties props;

    private BasicDataSource dataSource;

    public PoolConnectionDB() {
        this.carregarConfiguracoesBd();//Carrega as configs do bd a partir de arquivos
        this.configurarDataSourceRAC();//Configura o BasicDataSource
    }


    /**
     * Método que carrega os dados de acesso ao banco a partir de um
     * arquivo properties
     */
    private void carregarConfiguracoesBd(){
        try{
            String caminhoBanco = ArquivosUtil.getCaminhoAplicacao()+"/conexao.properties";
            File file = new File(caminhoBanco);
            FileInputStream fis = null;
            this.props = new Properties();
            fis = new FileInputStream(file);
            props.load(fis);
        }catch(IOException ex){
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }
    }

    /**
     * Método que configura um BaseDataSource com uma conexão ativa (pode ser aumentado)
     */
    private void configurarDataSourceRAC(){
        this.dataSource = new BasicDataSource();
        this.dataSource.setDriverClassName(props.getProperty("nome_driver"));
        this.dataSource.setUsername(props.getProperty("usuario"));
        this.dataSource.setPassword(props.getProperty("senha"));
        this.dataSource.setUrl(props.getProperty("url_conexao"));
        this.dataSource.setInitialSize(1);//Seta o pool para apenas uma conexão ativa
        this.dataSource.setMinIdle(1);//Obriga o pool a ter pelo menos uma conexão sempre ativa
        this.dataSource.setTestOnReturn(true);//Habilita o teste da conexão antes de retorná-la
        this.dataSource.setValidationQuery("SELECT sysdate FROM dual");//Query que serve para atestar conectividade (para oracle)
    }

    /**
     * Método que retorna uma conexão do BasicDataSource.
     * Nesse caso ele verifica se existe uma conexão pronta, senão existir verifica
     * se o número de conexões está abaixo do que foi estabelecido, se estiver cria
     * a conexão e devolve.
     * @return Uma conexão do pool
     */
    public Connection getConexaoRAC(){

        try{            
            return dataSource.getConnection();
        }catch (SQLException sqle){
            sqle.printStackTrace();
            ArquivosUtil.gravarLog(DiversosUtil.getMensagemExcecao(sqle), ArquivosUtil.LOG_TIPO_ERRO);
        }catch (Exception e){
            e.printStackTrace();
            ArquivosUtil.gravarLog(DiversosUtil.getMensagemExcecao(e), ArquivosUtil.LOG_TIPO_ERRO);
        }

        return null;

    }

    /**
     * Mostra informações do DataSource
     */
    public void showStatusDataSource(){
        System.out.println("Conexões ativas: "+dataSource.getNumActive());
        System.out.println("Conexões inativas: "+dataSource.getNumIdle());
    }

    /**
     * Fecha tudo o que foi usado pelos DAO's incluindo a conexão.
     * Nesse caso a conexão não é fechada de fato como no JDCB puro, e sim devolvida
     * ao pool de conexão (BasicDataSource)
     * @param rs ResultSet
     * @param ps PreparedStatement
     * @param conn Connection (oriunda do BasicDataSource, mas pode ser a do JDBC também)
     */
    public static void liberarRecursosBD(ResultSet rs, PreparedStatement ps, Connection conn){
        try{
            if (ps != null)
            ps.close();
            if (rs != null)
                rs.close();
            if (conn != null)
                conn.close();
        }catch (SQLException sqle){
            sqle.printStackTrace();
            ArquivosUtil.gravarLog(DiversosUtil.getMensagemExcecao(sqle), ArquivosUtil.LOG_TIPO_ERRO);
        }catch (Exception e){
            e.printStackTrace();
            ArquivosUtil.gravarLog(DiversosUtil.getMensagemExcecao(e), ArquivosUtil.LOG_TIPO_ERRO);
        }

    }

}//Fim da classe PoolConnectionDB

Novamente agradeço pelo Vinny pela ajuda :)[/quote]

laudenpower, Muito obrigado meu jovem… estou correndo atras desta solução tem tempo! vou tentar implementar…

só uma dúvida, essa classe pode ser usada em conjunto com o hibernate? como seria para passar a conexão para ele?

Abraço

Olá bom dia,

estou com problemas com o C3P0, rodo uma aplicação Java + Hibernate + Swing + Postgre num servidor windows server 2003, problema é que o sistema está abrindo conexões várias e não está elimiando as mesmas só quando o programa é fechado, que libera aquela conexão, nos metodos de consulta fiz sempre assim:

public List pesqAlunosEnturmados(Enturmar enturmar)
    {
        List<Enturmar> listaEnturmar = new ArrayList();
        try
        {
            Session sessao = HibernateUtil.getSession();
            Query query = sessao.createQuery("from Enturmar where matricula_turmas_codigo = :turma");
            query.setInteger("turma", enturmar.getMatricula_turmas_codigo());
            List<Enturmar> listEnturmar = query.list();
            if(listEnturmar.size() > 0)
            {
                listaEnturmar = listEnturmar;
            }
            sessao.close();
        }
        catch (Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Erro pesqAlunosEnturmados: " + erro);
        }
        return listaEnturmar;
    }

e no .properties está assim agora:

# To change this template, choose Tools | Templates
# and open the template in the editor.
hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost:5432/postgres
hibernate.connection.username = postgres
hibernate.connection.password = *****
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
hibernate.c3p0.min_size=1
hibernate.c3p0.max_size=200
hibernate.c3p0.timeout=14400
hibernate.c3p0.max_statements=0
hibernate.c3p0.minPoolSize=1
hibernate.c3p0.maxIdleTime=60
hibernate.c3p0.idleConnectionTestPeriod=60
hibernate.c3p0.maxIdleTimeExcessConnections=10
hibernate.show_sql = true
hibernate.format_sql = true

Será que alguém poderia me dar uma ajuda, ou um caminho para mim seguir.

Obrigado.

Você não está abrindo várias conexões feito eu não? tipo, para cada usuário que loga no sistema, ao inves dele buscar a conexão no pool, ele abrir uma conexão com o usuário e senha propio dele? estava fazendo isso ao inves de usar a conexao do pool e por isos o meu nao estava funcionando.

Eu estou usando hibernate e com isso fiz uma classe chamada HibernateUtil como abaixo:

package br.com.projeto_gerencial.hibernate_util;
/**
 *
 * @author AdilsonBad
 */
import java.io.FileInputStream;
import java.util.Properties;
import javax.swing.JOptionPane;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.properties.EncryptableProperties;

public class HibernateUtil {

    private static SessionFactory FabricaSessoes;
    static
    {
        try
        {
             StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
             encryptor.setPassword("SGC_DataBase");
             //
             Properties props = new EncryptableProperties(encryptor);
             //
             props.load(new FileInputStream("hibernate.properties"));
             //
             props.setProperty("hibernate.connection.password", props.getProperty("hibernate.connection.password"));
             //
             FabricaSessoes = new Configuration().setProperties(props).configure().buildSessionFactory();
        }
        catch (Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Erro na fabrica de sessões.: " + erro);
            FabricaSessoes = null;
        }
    }

    /*
     * Cria Método que retorna uma Sessão
     */
    public static Session getSession()
    {
        return FabricaSessoes.openSession();
    }
}

Em todos os metodos que faço consulta no BD eu chamo eles assim:

public Boolean editarTurma(Turmas turma)
    {
        Boolean retorno = false;
        try
        {
            Session sessao = HibernateUtil.getSession();
            Transaction tx_turmas = sessao.beginTransaction();
            sessao.update(turma);
            tx_turmas.commit();
            sessao.close();
            retorno = true;
        }
        catch (Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Erro na inserção: " + erro);
        }
        //Retorna false ou true
        return retorno;
    }

Eu chamo o HibernateUtil.getSession();

agora não sei se isso ele está pegando uma sessão, pq parece que ele está criando uma conexão.