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

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,

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!

[quote=“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![/quote]

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,

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?

[quote=“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?[/quote]

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?

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.

[quote=“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.[/quote]

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.

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!

[quote=“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![/quote]

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