Atualização de consultas após uma inserção

8 respostas
W

Salve!

Em uma pagina jsp inicio a conexao com o banco dentro do metodo jspInit()

<%!

private Connection con;

private ConectaBd conexao;
public void jspInit(){     
conexao = new ConectaBd();  //objeto q realiza a conexao
con = conexao.open();                                  
}

public void jspDestroy(){
conexao.close();
}

%>

Passo essa conexao para uma classe que realiza as operações de query

<%
colaboradores.conectar(con);

Vector listColaboradores = colaboradores.list();  //retorna uma lista que sera apresentada como resposta

%>

Realizo uma operação de inserção no banco de dados e após a inserção faço um redirecionamento para a mesma página que contém o código acima. No entanto, o metodo que realiza a consulta no banco de dados
( Vector listColaboradores = colaboradores.list(); ) nao retorna o resultado atualizado. Para que a página apresente o resultado atualizado eu tenho q realizar a conexao com banco de dados fora do metodo jspInit(), ou seja, criar um novo objeto de conexao a cada requisição.

<%

/*

*Solucao encontrada para realizar a atualizacao do conteudo da pagina

*a cada requisicao realizada.

*/

conexao = new ConectaBd();

con = conexao.open();
colaboradores.conectar(con);
Vector listColaboradores = colaboradores.list();

%>

Alguem sabe se é possível contornar esse problema usando o jspIniti() para abrir a conexao ou essa eh a única solução.

Obrigado,

8 Respostas

thiagorani

Pq voce nao trabalha com a con dentro do metodo list() da sua classe ConectaBd?

Qdo voce chamar o ConectaBd.list(), esse lista instancia ou recupera a conn, faz a consulta ao banco, popula o Vector e retorna para o jsp.

Não é uma boa prática trabalhar com Connection no jsp.
jsp = camada de apresentacao!

W

“thiagorani”:
Pq voce nao trabalha com a con dentro do metodo list() da sua classe ConectaBd?

Qdo voce chamar o ConectaBd.list(), esse lista instancia ou recupera a conn, faz a consulta ao banco, popula o Vector e retorna para o jsp.

Não é uma boa prática trabalhar com Connection no jsp.
jsp = camada de apresentacao!

Fiz as modificacoes descristas (obrigado pela dica), no entanto, ainda continuo sem obter a atualizacao da minha consulta. O codigo ficou assim:

Instancio um objeto que realiza a conexao com o banco de dados na jsp
<%!
private ConectaBd conexao;

public void jspInit(){
    //conexao com o Banco de Dados
conexao = new ConectaBd();  	
}

public void jspDestroy(){
conexao.close();
}

%>

Recupero a conexao com o metodo getCon() do objeto conexao e realizo a consulta

<%

colaboradores.conectar(conexao.getCon());

Vector listColaboradores = colaboradores.list();

%>

Segue a classe do objeto colaboradores:

//realiza a persistencia do objeto Colaborador
public class PColaborador extends Colaborador{

private PreparedStatement ps;    
private Connection con;
private ResultSet rs;

/** Creates a new instance of PColaborador */
public PColaborador() {
}

public PColaborador(Connection con) {
    this.con = con;
}

public void conectar(Connection con) {
    this.con = con;
}

//retorna uma lista com todos os Colaboradores armazenados no sistema
public Vector list() {
    try{            
        ps = con.prepareStatement("select * from Colaborador");
        rs = ps.executeQuery();
        Vector list = new Vector();
        while (rs.next()) {
            Colaborador c = new Colaborador();                
            c.setNome(rs.getString("nome"));
            c.setSenha(rs.getString("senha"));
            c.setLogin(rs.getString("login"));
            list.add(c);
        }
        list.trimToSize();
        return list;
    }
    catch(Exception e) {
        System.out.println( "Error in try-catch --&gt; PColaborador.list()
" + e.getMessage() );

e.printStackTrace();

return null;

}

finally{

try{

ps.close();

}

catch(SQLException e){

System.out.println( "Error in finally --> PColaborador.list()

" + e.getMessage() );

e.printStackTrace();

}

}

}

}

Veja tambem a classe que realiza a conexao com o banco de dados:
public class ConectaBd{

private Connection con;

public ConectaBd(){
    try {
        
        //conexao com o mysql
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        
        con = DriverManager.getConnection("jdbc:mysql://localhost/XXX?user=XXX&amp;password=XXX");
    con.setAutoCommit(false);
        
}
catch(Exception e) {
        System.out.println( "Erro na conexao com o Banco de Dados --&gt; ConectaBd.java
" +

e.getMessage() );			

}

}
//retorna uma conexao com o banco de dados
public Connection getCon() {		
	return con;		
}

//fecha conexao com o banco de dados
public void close() {
    try {
        con.close();
}
catch(Exception e) {
        System.out.println( "Erro ao fechar o Banco de Dados --&gt; ConectaBd.java
" +

e.getMessage() );

}

}

}

Espero que esteje claro o problema.

Obrigado,

thiagorani

Cara aqui esta o erro: con.setAutoCommit(false);

Voce setou a connection para nao ser autoCommit.
Faz con.setAutoCommit(true); ou
depois de cada inserção execute um con.commit();

Blz?

W

“thiagorani”:
Cara aqui esta o erro: con.setAutoCommit(false);

Voce setou a connection para nao ser autoCommit.
Faz con.setAutoCommit(true); ou
depois de cada inserção execute um con.commit();

Blz?

Esse nao eh o erro. Estou usando con.commit() depois de cada inserção. E para garantir realizei uma consulta direta ao banco para verificar se os dados foram armazenados corretamente.
Se eu nao instanciar o objeto conexao dentro do jspInit(), mas fora dele, obtenho o resultado atualizado. Acho q o problema e com a inicialização do objeto que realiza a conexao com o banco de dados, pois se ele eh instanciado dentro do jspInit() novas requisicoes da pagina nao criam um novo objeto para conexao com banco. So nao entendo o porque do metodo list() nao retornar a consulta atualizada. Serah q para a mesma select a conexao usa os mesmos resultados obtidos da ultima consulta? Eh uma boa prática instanciar um novo objeto de conexao a cada requisicao?

thiagorani

Como eu disse nao mexa com conexao no jsp.

Chama a classe que retorna uma con dentro do seu List(), usa essa conexao, preenche seu vetor e ja era! Deixa a manipulacao das con dentro das sua classes e nao no jsp!

con = suaclasse.getConnection();

while

con.close();

return vector

mais ou menos isso.

W

“thiagorani”:
Como eu disse nao mexa com conexao no jsp.

Chama a classe que retorna uma con dentro do seu List(), usa essa conexao, preenche seu vetor e ja era! Deixa a manipulacao das con dentro das sua classes e nao no jsp!

con = suaclasse.getConnection();

while

con.close();

return vector

mais ou menos isso.

Ok…mas então me tira duas duvidas:
1 - O custo de abrir e fechar uma conexao com o banco de dados a toda requisicao na eh elevado?
2 - Em qual situacao eu devo usar o metodo jspInit() e jspDestroy() em uma jsp?

Valeu.

thiagorani

Entao, o esquema é voce trabalhar com um pool de conexoes. Uma classe que gerencie as conexoes com o banco. Voce nao precisa ficar criando conexoes com o banco a todo momento. O esquema do pool é mais ou menos assim, voce pega uma conexao, usa, e retorna ela para o pool.
Existem bons tópicos sobre Pool de conexões aqui no GUJ!

W

“thiagorani”:
Entao, o esquema é voce trabalhar com um pool de conexoes. Uma classe que gerencie as conexoes com o banco. Voce nao precisa ficar criando conexoes com o banco a todo momento. O esquema do pool é mais ou menos assim, voce pega uma conexao, usa, e retorna ela para o pool.
Existem bons tópicos sobre Pool de conexões aqui no GUJ!

Obrigado pelas informações. Elas vão me ajudar a melhor os novos codigos.

Criado 28 de janeiro de 2004
Ultima resposta 29 de jan. de 2004
Respostas 8
Participantes 2