QUerys lentas(aprox. 20 segundos cada)

6 respostas
guilherme.dio

Minhas querys estão demorando muito para serem concluídas, e não sei o porquê, aqui vai um exemplo de um método que consulta se há alguma ver~soa mais nova do programa diponível, onde faz a query numa tabela que só há uma coluna com um unico dado, poruqe quando há atualização eu apenas aumento o numero da versão na tabela:

public boolean consultaVersão(double versão)
    {
        Statement consulta;
        ResultSet retorno;
        String comando = "SELECT * FROM atualizacao";
        boolean atualização=false;
        try
        {
            consulta=conn.createStatement();
            retorno=consulta.executeQuery(comando);
            retorno.next();
            if(versão<retorno.getDouble("versao"))
            {atualização=true;}
            consulta.close();
            retorno.close();
        }
        catch(Exception e)
        {
            System.out.println("Erro consultaVersão()\n"+e.getMessage());
        }
        return atualização;
    }

e aqui o codigo que faz a chamada:

public Menu_Principal()
    {
        comandos=new Banco.Comandos_BD();
        atualização=comandos.consultaVersão(versão);
        initComponents();
    }
private void formKeyPressed(java.awt.event.KeyEvent evt) {                                
        if(evt.getKeyCode()==java.awt.event.KeyEvent.VK_F12)
        {
            if(atualização==true)
           {
                javax.swing.JOptionPane.showMessageDialog(null,
                           "Versão Desatualizada: "+versão
                          +"\nFaça o download da nova",
                           "Erro - Versão",
                           javax.swing.JOptionPane.WARNING_MESSAGE);
...
...
...

Alguém pode me dar uma ajuda?

6 Respostas

guilherme.dio

OBS a variável conn é uma Connection, que já esta iniciada no construtor do DAO com a conexão no servidor;

peczenyj

vejamos,

se só te interessa uma coluna, pq fazer select * ?

“SELECT versao FROM atualizacao”

agora se só tem um registro, pegue este registro

“SELECT versao FROM atualizacao WHERE id= 1” // ou qq que seja o numero

fica dificil descobrir onde esta o problema sem fazer um profilling na aplicação e analisar o banco de dados, mas com certeza um select * é menos eficiente do que um select mais exato.

agora vc deveria tentar fechar o ResultSet e o Statement em um bloco finally.

guilherme.dio

como faço esse bloco finally?

ViniGodoy

Você faz o finally assim:

public boolean consultaVersão(double versão) {
   PreparedStatement consulta;
   ResultSet retorno;

   try {
      try {
         consulta=conn.prepareStatement("SELECT versao FROM atualizacao");
         retorno=consulta.executeQuery(comando);
         retorno.next();
   
         return versão&lt;retorno.getDouble("versao");
      } finally {
         if (conn != null) conn.close();
         if (consulta != null) consulta.close();
         if (retorno != null) retorno.close();
      }
   } catch(Exception e) {
      System.out.println("Erro consultaVersão()\n"+e.getMessage());
   }
}

O finally sempre será executado.

Para agilizar queries certifique-se que:

  1. Você usa a clausula where;
  2. Você só requisita os campos que vai utilizar;
  3. Você criou corretamente as chaves no banco;
  4. Você tem índices em campos que:
    a) Você pesquisa demais (chaves candidatas, por exemplo);
    b) Você ordena dados;
  5. Você fecha conexões, statements e resultsets num finally.
  6. Para que não haja demora com as conexões, você utiliza um ConnectionPool como o DBCP ou o C3P0;>
guilherme.dio

A más se eu ficar fechando a conexão em toda consulta é ruim, pq fica lento pra conectar novamente

ViniGodoy

Por isso você segue a dica 6, que postei ali.

Criado 30 de abril de 2011
Ultima resposta 30 de abr. de 2011
Respostas 6
Participantes 3