Otimização

4 respostas
T

Fala Galera java! Acabo de me recadastrar e trago um probleminha para resolver. Estou escrevendo uma aplicação que usa db Oracle, o problema é que esta muito lento. Tenho que fazer 140 selects na base de dados o que justifica ser uma aplicação pesada por natureza. Mesmo assim ai vai o código para ver se alguém consegue otimizar.
Bom estar de volta!
Abraço a todos e obrigado.

import java.util.*;
import java.io.*;
import java.sql.*;

public class SelectEdita {
  
   protected static String retorno = "";
   
   protected static String pageSelect(String data, int sala, int turno) {
      
      StringBuffer html = new StringBuffer();
      
      Busca_CD_Escala esc = new Busca_CD_Escala();
           
      html.append("<select name=\"esc_servico\">");
      
      html.append("<option value=\"" + esc.cdVazio(data,sala,turno) + "\">");
              
   try {
      
      //Cria conexão com a base de dados
         
      Connection con = DataConnect.connectDb();
      
      Statement stmt = con.createStatement();
      
      String sql = "select cd_servico, ds_servico, sum(cd_escala) as cd_escala, sum(cd_sal_cir), sum(tp_turno) " +
                    "from ( " +
                    "select e.cd_servico as cd_servico, s.ds_servico as ds_servico, e.cd_escala as cd_escala, e.cd_sal_cir as cd_sal_cir, e.tp_turno as tp_turno " +
                    "from   dbamv.escala_cirurgia e, dbamv.servico s " +
                    "where e.dt_escala = '" + data + "' " +
                    "and e.cd_sal_cir = '" + sala + "' "  +
                    "and e.tp_turno = '" + turno + "' " +
                    "and e.cd_servico = s.cd_servico(+) " +
                    "union " +
                    "select s.cd_servico, s.ds_servico, 0, 0, '0' " +
                    "from   dbamv.servico s " +
                    "where  s.sn_pre_internacao = 'S' ) " +
                    "group by cd_servico, ds_servico";
  
        ResultSet rs = stmt.executeQuery(sql);
        
        //faz primeira busca no banco de dados
        
             while (rs.next()){
            
             int cd_escala = rs.getInt("cd_escala");
             int ecd_servico = rs.getInt("cd_servico");
             //int scd_servico = rs.getInt("cd_servico");
             String sds_servico = rs.getString("ds_servico");
                                   
              html.append("<option value=\"");
              html.append(esc.cdEscala(data, sala, turno));
              html.append(":"+ecd_servico);
              html.append(":"+data);
              html.append(":"+sala);
              html.append(":"+turno);
              html.append("\"");
                                                     
              if ( cd_escala > 0 ){                
              html.append(" selected");
              } 
              
              //if (ecd_servico == 0){
              
              //html.append("");
                              
              //}
              
              html.append(">");
              html.append(sds_servico);
              
             }   
   //tenta fechar a conexão com o banco de dados
      
   try {
            
    con.close();
      
      } catch(Exception e)  {
           
      e.printStackTrace();
            
      }
   //pega erro (se houver na query)
            
  	 } catch(Exception e) {
      
     e.printStackTrace();
     
   	}
  //fecha select
   html.append("</select>");      

   retorno = html.toString();
    
   return retorno;
   
   }
 
}
Agora a classe Busca_CD_Escala
import java.util.*;
import java.io.*;
import java.sql.*;

public class Busca_CD_Escala {
  
   protected static String retorno = "";
   
   protected static String cdEscala(String data, int sala, int turno) {
      
      StringBuffer html = new StringBuffer();
      
try {
      
      //Cria conexão com a base de dados
         
      Connection con = DataConnect.connectDb();
      
      Statement stmt = con.createStatement();
         
      String sql = "select cd_escala from dbamv.escala_cirurgia " +
                   "where dt_escala = '" + data + "' " +
                   "and cd_sal_cir = '" + sala + "'" +
                   "and tp_turno = '" + turno + "'";
   
      ResultSet rs = stmt.executeQuery(sql);
   
      //faz primeira busca no banco de dados
            
   while (rs.next()){
      
       int cd_escala = rs.getInt("cd_escala");
                
        html.append(cd_escala);
    
   }
   
   //tenta fechar a conexão com o banco de dados
      
   try {
            
    con.close();
      
      } catch(Exception e)  {
           
      e.printStackTrace();
            
      }
      
     //pega erro (se houver na query)
            
  	 } catch(Exception e) {
      
     e.printStackTrace();
     
   	}
   
   retorno = html.toString();
             
   return retorno;
   
   }
   
   
   protected static String retorna = "";
   
   protected static String cdVazio(String data, int sala, int turno) {
      
      StringBuffer html = new StringBuffer();
      
try {
      
      //Cria conexão com a base de dados
         
      Connection con = DataConnect.connectDb();
      
      Statement stmt = con.createStatement();
         
      String sql = "select * from dbamv.escala_cirurgia " +
                   "where dt_escala = '" + data + "' " +
                   "and cd_sal_cir = '" + sala + "'" +
                   "and tp_turno = '" + turno + "'";
   
      ResultSet rs = stmt.executeQuery(sql);
   
      //faz primeira busca no banco de dados
            
   while (rs.next()){
      
        int cd_servico = rs.getInt("cd_servico");
        int cd_escala = rs.getInt("cd_escala");
                
        html.append(cd_escala);
        html.append(":"+cd_servico);
        html.append(":"+data);
        html.append(":"+sala);
        html.append(":"+turno);
    
   }
   
   //tenta fechar a conexão com o banco de dados
      
   try {
            
    con.close();
      
      } catch(Exception e)  {
           
      e.printStackTrace();
            
      }
      
     //pega erro (se houver na query)
            
  	 } catch(Exception e) {
      
     e.printStackTrace();
     
   	}
   
   retorna = html.toString();
             
   return retorna;
   
   }
    
 
}

São setenta selects na base para popular o select, e mais setenta para popular uma parte do combo atravéz da classe Busca_CD_Escala.
Aguardo a ajuda dos gurus!

4 Respostas

G
String sql = "select * from dbamv.escala_cirurgia " + 
                   "where dt_escala = '" + data + "' " + 
                   "and cd_sal_cir = '" + sala + "'" + 
                   "and tp_turno = '" + turno + "'"; 
    
      ResultSet rs = stmt.executeQuery(sql); 
    
      //faz primeira busca no banco de dados 
            
   while (rs.next()){ 
      
        int cd_servico = rs.getInt("cd_servico"); 
        int cd_escala = rs.getInt("cd_escala"); 
                
        html.append(cd_escala); 
        html.append(":"+cd_servico); 
        html.append(":"+data); 
        html.append(":"+sala); 
        html.append(":"+turno); 
    
   }

Kra, vc está usando 2 campos e está dando um " select * " na tabela?

Assim mata mesmo :lol: .

Outra coisa, procure fazer busca pelos índices, dei uma olhada bem por cima, infelizmente estou sem tempo pra te ajudar com + calma, mas pelo q vi, acho q c vc fizesse isso jah ajudaria um pouco.

Outra coisa, sua query que usa union não poderia ser substituida por uma view no banco?

Vc deixaria a view jah pronta e buscaria a partir dele, colocando um monte de restrição (WHERE bla = 1, bla2 = bla ) a busca seria bem mais eficiente.

Dê uma olhada nisso

[]'s

P

outra dica,
procura dar uma olhada em PreparedStatement
vai deixar seu código muito mais legivel e facil de trabalhar.

A

O uso de PreparedStatement também ajuda na otimização. Da maneira como seu código está, para cada vez que o select é submetido ao banco são feitas verificações que validam a instrução. Então no seu caso são feitas 140 verificações. Com o uso de PreparedStatement o select é analisado somente na primeira vez; depois o que ocorre é apenas a substituição dos valores que são passados como parâmetros em cada execução.

T

Valeu Galera do Portal.
Vou fazer uns prepared statement para ver o resultado, também achei as 140 queries um tanto quanto pesado, mas vamos ver como fica com o prepared statement!

Criado 26 de abril de 2006
Ultima resposta 27 de abr. de 2006
Respostas 4
Participantes 4