Consulta no BD, utilizando JSP

6 respostas
EduFranzoni

Boa tarde galera do GUJ,

Estou com um probleminha! Estou precisando fechar a conexão com o BD em todos os métodos que efetuam uma consulta.

O problema acontece quando esse método de consulta, retorna um ResultSet e eu fecho a conexão, não sei o que acontece (seja em qual método for), na página após o login da aplicação a tela fica branca.

Só consigo fechar a conexão normal quando esse método retorna uma String ou Inteiro, por exemplo.

Isso acontece porque eu utilizo o resultset no JSP e ao fechar a conexao ele impede do JSP ter acesso a váriavel ResultSet que o método retornou?

O método está assim.

public ResultSet GetDetalheAceitoUsuario(int idUsuario, String ip)
    {
        conexao.AbreConexao();

        try
        {
            String query = "SELECT * FROM tabelaUsuario";

            rs = conexao.stmt.executeQuery(query);
        }
        catch(Exception e)
        {
            l//gera log.
        }

        return rs;
    }

e eu quero deixá-lo assim(mas acontece o erro tela branca citado acima):

public ResultSet GetDetalheAceitoUsuario(int idUsuario, String ip)
    {
        conexao.AbreConexao();

        try
        {
            String query = "SELECT * FROM tabelaUsuario";

            rs = conexao.stmt.executeQuery(query);
            conexao.FechaConexao(); //INSERINDO ESSA LINHA, EM QUALQUER MÉTODO QUE RETORNE RESULTSET. acontece o erro tela branca apos o login da aplicação. mto estranho.
        }
        catch(Exception e)
        {
            l//gera log.
        }

        return rs;
    }

Alguém pode me ajudar?

valeu.

6 Respostas

drsmachado

Você está errado.
O ResultSet é um objeto de consulta ao banco, deve permanecer ali.
O que você precisa fazer é utilizar um outro objeto para passar da camada de persistência até as jsps

EduFranzoni

hmm, mas quando eu chamo o método. eu declaro outro objeto do tipo result set.

No jsp:

ResultSet rsConsulta = classeConsulta.GetDetalheAceitoUsuario(10, request.getRemoteHost());

ainda sim continua errado? o que deveria ser feito então?

JavaChild msmo rs.

drsmachado

A grosso modo, o resultset fica aberto enquanto a connection estiver nessa condição.
Independente de você instanciar um objeto, o valor dele só será passado ao fim do método que realiza o select (faça um teste, crie duas classes, uma contendo um método que retorne o valor de um atributo da outra e que contenha um while(true), pra entender).
Desta forma, para que o valor seja passado, o método precisa ser concluído.
Para concluir o método, precisa fechar a connection.
Fechando a connection, o resultset é fechado…

Se você faz a varredura do resultset na classe em que existe a consulta, coloca o(s) resultado(s) em um outro objeto adequado (seja string, objeto personalizado ou uma list) você pode retornar e já trabalhar com ele na jsp.

Em tempo, pesquise sobre patterns em camadas, MVC pode até ser mais trabalhoso, mas dá menos manutenção e problemas.

EduFranzoni

então a solução é o método não retornar o ResultSet e sim ja fazer a manipulação que eu faria no JSP nesse proprio método?

drsmachado

Exatamente.

EduFranzoni

Valeu, obrigado!

Criado 23 de setembro de 2011
Ultima resposta 23 de set. de 2011
Respostas 6
Participantes 2