Duvida em como utilizar corretamente um pool de conexão

4 respostas
S

Galera montei um pool de conexão no tomcat, ejá consegui usa-lo, minha duvida é qual a maneira correta de utilizar este pool, eu fiz da seguinte forma:

public static ResultSet consultar(String sql) {//executa consultas de sql
        try {
            ic = new InitialContext();
            dats = (DataSource) ic.lookup("java:/comp/env/banco");
            c = dats.getConnection();
            Statement st = c.createStatement();
            ResultSet res = st.executeQuery(sql);
            return (res);
        } catch (Exception e) {
            System.err.print(e.getMessage());
            System.err.print("erro execução sql");
        }
        return null;
    }

mas vi que toda vez que eu fazia uma consulta uma conexão era aberta, assim estourando o numero limite de conexões.

Ai fiz da seguinte forma:

public static ResultSet consultar(String sql) {//executa consultas de sql
        try {
            if (c == null || c.isClosed()) {
                ic = new InitialContext();
                dats = (DataSource) ic.lookup("java:/comp/env/banco");
                c = dats.getConnection();
            }
            Statement st = c.createStatement();
            ResultSet res = st.executeQuery(sql);
            return (res);
        } catch (Exception e) {
            System.err.print(e.getMessage());
            System.err.print("erro execução sql");
        }
        return null;
    }

Mas desta forma, as vezes depois de muito tempo de inatividade do pagina, a conexão com o banco é fechada, quando tento novamente acessa-la da o erro de que o banco não esta conectado, ai tento mais uma vez e entra, ou seja na primeira tentativa ele faz a conexão e gera a mensagem de erro, mas na segunda tentativa funciona corretamente, e outro problema desta forma é que vai gerar uma unica conexão para todos os pedidos, gostaria da opinião de vcs pra saber a melhor forma de se fazer isso.
Obrigado!

4 Respostas

T

Mude a interface de seu método de consulta; não faça mais voltar um ResultSet, porque é difícil do jeito que você fez fechar a conexão. Você SEMPRE tem de fechar a conexão (do jeito que você fez, a conexão fica aberta até sabe lá Deus quando…).

Em vez disso, consulte as coisas dentro do seu método de consulta, e retorne uma lista de objetos.

S

thingol:
Mude a interface de seu método de consulta; não faça mais voltar um ResultSet, porque é difícil do jeito que você fez fechar a conexão. Você SEMPRE tem de fechar a conexão (do jeito que você fez, a conexão fica aberta até sabe lá Deus quando…).

Em vez disso, consulte as coisas dentro do seu método de consulta, e retorne uma lista de objetos.


Então o melhor seria eu criar a conexão e fecha-la dentro deste mesmo método? ou seja se tenho 2 sql pra rodar, será aberto e fechado a conexão 2 vezes correto?

T

Vou explicar mais ou menos como é que funciona um pool. Quando você obtém uma conexão do pool (com dats = (DataSource) ic.lookup(“java:/comp/env/banco”); c = dats.getConnection(); ) ele lhe volta um objeto que encapsula uma Connection, mas não é a verdadeira Connection do Banco. Quando você chama o método close, você simplesmente devolve a conexão verdadeira ao pool (talvez o pool feche e abra novamente a conexão se ela estiver por muito tempo inativa, por exemplo).
Então é realmente isso que você falou: obtenha a conexão (com getConnection), use-a, e então a feche. Se a conexão real ao banco vai ou não ser fechada, depende do pool.

S

thingol:
Vou explicar mais ou menos como é que funciona um pool. Quando você obtém uma conexão do pool (com dats = (DataSource) ic.lookup(“java:/comp/env/banco”); c = dats.getConnection(); ) ele lhe volta um objeto que encapsula uma Connection, mas não é a verdadeira Connection do Banco. Quando você chama o método close, você simplesmente devolve a conexão verdadeira ao pool (talvez o pool feche e abra novamente a conexão se ela estiver por muito tempo inativa, por exemplo).
Então é realmente isso que você falou: obtenha a conexão (com getConnection), use-a, e então a feche. Se a conexão real ao banco vai ou não ser fechada, depende do pool.

Valeu amigo vou testar!

Criado 5 de agosto de 2008
Ultima resposta 5 de ago. de 2008
Respostas 4
Participantes 2