Qual a forma mais rápida de gravar uma query em um AbstractTableModel

2 respostas
A

Ola amigos, estou tendo muita lentidão ao realizar uma Query em uma banco de dados MYSQL na WEB,
Preciso realizar uma query e grava-la em um AbstractTableModel

Teria um jeito mais adequado e rápido para efetuar esse procedimento?

Veja como estou fazendo:

// CONSULTA NO BANCO DE DADOS

          String VSql1 = "SELECT codigo, destinatario, lista, dataenvio FROM fila WHERE usuario = '"+sms.main.usuario+"' order by dataenvio";
        try {
            
            ArrayList lista;
            Statement consulta3 = conexao.getConexao().createStatement();
            conexao.rs[3] = consulta3.executeQuery(VSql1);
            
                lista = new ArrayList();
                while (conexao.rs[3].next()) {

            geteset geteset = new geteset();
            geteset.setCodigo(conexao.rs[3].getInt("codigo"));
            geteset.setdestinatario(conexao.rs[3].getString("destinatario"));
            geteset.setlista(conexao.rs[3].getString("lista"));
            geteset.setdata(conexao.rs[3].getTimestamp("dataenvio"));
            lista.add(geteset);
                    }
            
            conexao.rs[3].close();
            consulta3.close();

            return lista;


        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro de conexão com banco de dados, tente novamente");
            return null;
        }
// GRAVAÇÂO DA LISTA NA JTABLE


private void carregalsta1(){

 lista = new geteset.geteset().consulta3();
getModel().limpar();
total=0;

            for (i = 0; i < lista.size(); i++) {
            geteset.geteset geteset = lista.get(i);
                total++;
                getModel().addListaDeSocios(getSocios());
                jLabel2.setText(String.valueOf(total));
            
            }
}



private List<Socio> getSocios() {
              List<Socio> socios = new ArrayList<Socio>();
  
            geteset.geteset geteset = lista.get(i);
                
                Socio socio = new Socio();
                socio.setRemetente(geteset.getdestinatario());
                socio.setData(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(geteset.getdata()));
                socio.setLista(geteset.getlista());
                socio.setcodigo(geteset.getCodigo());
                socios.add(socio);


            

return socios;
}

Agradeço a ajuda!

2 Respostas

ViniGodoy

Seu código tem uma série de problemas:

  1. Por os resultsets são guardados dentro da variável conexao? Além de não fazer sentido, isso pode gerar desperdício de muita memória;
  2. Por que no código do banco você não cria o List<Socio> direto? Não vi propósito dessa classe getset sequer existir;
  3. É perigoso (e inútil), não limitar a consulta a uma quantidade máxima de registros.
  4. Ao realizar consultas, prefira o PreparedStatement.

String VSql1 = "SELECT codigo, destinatario, lista, dataenvio FROM fila WHERE usuario = ? ORDER BY dataenvio" try { List&lt;geteset&gt; lista = new ArrayList&lt;geteset&gt;; Statement consulta3 = conexao.getConexao().prepareStatement(VSql1); consulta3.setString(1, sms.main.usuario); conexao.rs[3] = consulta3.executeQuery(VSql1);

Agora, seu código tem uma série de problemas:
5. No caso do código que preenche o model. O método chama-se “addListaDeSocios”. E nesse método você já passa a lista inteira. Então, para que o for de 0 até lista.size()?

A

ViniGodoy:
Seu código tem uma série de problemas:

  1. Por os resultsets são guardados dentro da variável conexao? Além de não fazer sentido, isso pode gerar desperdício de muita memória;
  2. Por que no código do banco você não cria o List<Socio> direto? Não vi propósito dessa classe getset sequer existir;
  3. É perigoso (e inútil), não limitar a consulta a uma quantidade máxima de registros.
  4. Ao realizar consultas, prefira o PreparedStatement.

String VSql1 = "SELECT codigo, destinatario, lista, dataenvio FROM fila WHERE usuario = ? ORDER BY dataenvio" try { List&lt;geteset&gt; lista = new ArrayList&lt;geteset&gt;; Statement consulta3 = conexao.getConexao().prepareStatement(VSql1); consulta3.setString(1, sms.main.usuario); conexao.rs[3] = consulta3.executeQuery(VSql1);

Agora, seu código tem uma série de problemas:
5. No caso do código que preenche o model. O método chama-se “addListaDeSocios”. E nesse método você já passa a lista inteira. Então, para que o for de 0 até lista.size()?

Olá Vini, Obrigado pela resposta.

Bom meus resultsets são guardados dentro da variável conexão pois possuo as vezes varias consultas distintas no banco de dados ao mesmo tempo, e tive problemas com mais de um resultset por conexão então acabei solucionando com isso.
Sobre as outras dicas irei resolver aqui, mais será que mudar para PreparedStatement irá aumentar a velocidade ?

Criado 28 de julho de 2012
Ultima resposta 30 de jul. de 2012
Respostas 2
Participantes 2