Lentidão pra preencher um jtable

10 respostas
L

tenho este método:

public void listacadC(){
        dbUtil db = new dbUtil();
        db.conectaDB();
        ResultSet rs = db.consultaDB("SELECT CODCATEGORIA, NOME FROM CATEGORIA");
  
        int i = 0;
        try {
            
            while(rs.next()){
                ((DefaultTableModel)jTable1.getModel()).addRow(new Vector());
                
                jTable1.setValueAt(rs.getString("CODCATEGORIA"), i, 0);
                jTable1.setValueAt(rs.getString("NOME"), i, 1);
                
                i++;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
               
        db.desconectaDB();
    }

essa tabela tem apenas 11 registros, e o programa está demorando quase 2 segs pra prencher a tabela…

Não sei se estou fazendo as coisas da maneira correta, o código funciona, mas 2 segs pra abrir uma tabelinha com 11 registros, eu achei D+, deveria ser instantâneo, abriu a tela jah deveria vir com a grid montada e preenchida.

Tem algum outro método??

10 Respostas

Mauricio_Linhares

Você já tentou fazer essa consulta sem usar o JTable pra ver quanto tempo demora?

P

Não testei aqui mas tente trocar :

try {
             
             while(rs.next()){
                 ((DefaultTableModel)jTable1.getModel()).addRow(new Vector());
                 
                 jTable1.setValueAt(rs.getString("CODCATEGORIA"), i, 0);
                 jTable1.setValueAt(rs.getString("NOME"), i, 1);
                 
                 i++;
             }
         } catch (SQLException ex) {
             ex.printStackTrace();
         }

por:

try {
            DefaultTableModel dmodel = (DefaultTableModel)jTable1.getModel();
             while(rs.next())
                 dmodel.addRow( new Object[]{ rs.getString("CODCATEGORIA"), rs.getString("NOME")  } );
                 
         } catch (SQLException ex) {
             ex.printStackTrace();
         }

também invoque o método listacadC() dentro de uma thread!!!

L

Mas ai como eu iria saber qto tempo está demorando?

Porque pelo menos exibindo o jTable, eu tenho uma idéia.

Mas vou tentar aqui de alguma forma pra ver…!!

L

plic_ploc:
Não testei aqui mas tente trocar :

try {
             
             while(rs.next()){
                 ((DefaultTableModel)jTable1.getModel()).addRow(new Vector());
                 
                 jTable1.setValueAt(rs.getString("CODCATEGORIA"), i, 0);
                 jTable1.setValueAt(rs.getString("NOME"), i, 1);
                 
                 i++;
             }
         } catch (SQLException ex) {
             ex.printStackTrace();
         }

por:

try {
            DefaultTableModel dmodel = (DefaultTableModel)jTable1.getModel();
             while(rs.next())
                 dmodel.addRow( new Object[]{ rs.getString("CODCATEGORIA"), rs.getString("NOME")  } );
                 
         } catch (SQLException ex) {
             ex.printStackTrace();
         }

também invoque o método listacadC() dentro de uma thread!!!

Blz… vou tentar isso dai sim, pena que só 2ª feira q vai dar… mas vou fazer sim, deps coloco aqui o resultado!

ViniGodoy

Se está com problemas de performance, baixe um profiler e use.
O Eclipse tem o projeto TPTP, que deve te ajudar nesse caso. O Netbeans também tem um profiler, que pode ser baixado na próprio site dele.
Se você não usa nenhum IDE desses, pode ainda baixar o EJP no sourceforce.

Com o profiler, você pode medir qual das chamadas de método está demorando e gerando a lentidão. Você precisa então otimizar essa chamada. É muito melhor do que ficar trocando métodos a esmo, complicar o seu código e não obter os resultados desejados.

Só mais uma dica… quando usar JTables, geralmente é mais rápido e mais fácil implementar o seu próprio TableModel, ao invés de ficar usando o Default.

L

Hummm, eu to usando o NetBeans no caso… nem sabia que existia uma ferramente desse tipo… mas vou baixar sim…

Sobre o TableModel… o engraçado, é que essas coisas nenhum livro ensina né… rsrsrs… mas vlw…

T+

ViniGodoy:
Se está com problemas de performance, baixe um profiler e use.
O Eclipse tem o projeto TPTP, que deve te ajudar nesse caso. O Netbeans também tem um profiler, que pode ser baixado na próprio site dele.
Se você não usa nenhum IDE desses, pode ainda baixar o EJP no sourceforce.

Com o profiler, você pode medir qual das chamadas de método está demorando e gerando a lentidão. Você precisa então otimizar essa chamada. É muito melhor do que ficar trocando métodos a esmo, complicar o seu código e não obter os resultados desejados.

Só mais uma dica… quando usar JTables, geralmente é mais rápido e mais fácil implementar o seu próprio TableModel, ao invés de ficar usando o Default.

ViniGodoy

E não custa lembrar das 5 regras para se fazer otimização.

ViniGodoy

Quanto ao TableModel, não deixe de conferir o tutorial da Sun:
How to use Tables.

L

Ainda não testei nada do que foi falado aqui, só testarei amanhã, 2ª feira.

Mas estava aqui pensando, se não poderia ser a chamada do método que conecta ao banco que está causando a lentidão. Por que eu faço da seguinte forma:

Ao abrir a tela de consulta, onde o JTable está, no evento WindowOpened ou seja ao abrir a tela eu chamo o método “listacadC” que por sua vez faz as seguintes ações:

Instancia a classe dbUtil db

chama o método db.conectaDB() (o qual se conecta ao banco)

executa o metodo db.consultaDB() (o qual faz a consulta e devolve um resultset)

faço o while que adiciona e preenche as linhas no JTable

depois chamo o metodo db.desconectaDB()

Sera que esses metodos referente ao banco, que estão deixando a montagem do grid lenta?

Como vcs tratam essa parte de banco? Tipo quando se inicia a aplicação já se conecta ao banco, ou faz como eu estou fazendo que só se conecta no momento em que for utilizar??

Existe um padrão pra isso??

ViniGodoy

Esse pode ser um motivo. O profiler tende a indicar coisas desse tipo.

O projeto Jakarta tem um Datasource que faz um pool de conexões para você.

Sempre que você necessitar de uma conexão, peça ao Pool. Se não houver conexões disponíveis, ele criará uma. A medida que as conexões vão sendo liberadas, ele não as fecha imediatamente. Elas ficam em “IDLE” por 30 minutos (configuração default) para poderem ser usadas novamente, caso necessário, sem a necessidade de recriação.

Para mais informações, dê uma olhada na classe BasicDatasource do projeto Commons - DBCP.

Criado 23 de março de 2007
Ultima resposta 26 de mar. de 2007
Respostas 10
Participantes 4