JSP com acesso ao BD lento

2 respostas
Bruno_Ferreira1
Bom dia! Estou fazendo uma aplicação com JSP e Servelets, é minha primeira aplicação do tipo. é uma página com várias abas, onde ao clicar em cada uma, irá buscar os dados daquela aba via ajax. No início testei e estava funcionando normal, apenas algumas implementações que eu ainda precisava fazer. Mas ultimamente, a chamada em Ajax não esta obtendo resposta, as vezes eu deixo la carregando, depois de um tempão ele carrega os dados(coloquei via javascript uma imagem de loading.gif enquanto carrega a requisição). Por enquanto estou usando o Access como banco de dados, ja utilizei ele em uma aplicação desktop com Swing, e funcionava normalmente sem esta lentidão. Talvez o meu problema seja na hora de fechar a conexão, pois estou utilizando uma classe DAO, e me veio um problema na hora de fechar a conexão:
import java.sql.*;
import javax.swing.JOptionPane;


public class AgendaDAO {
    
    //objeto que controla a conexão
       public Connection con;
       //objeto que executa as querys
       public PreparedStatement pstm;

       public Statement stm;

      public ResultSet carregaAgenda(){
           String sql="Select * from agenda";
           ResultSet rs=null;
        try {
            con = new Conexao().criaConexao();
            stm =con.createStatement();
            rs = stm.executeQuery(sql);
            return rs;

        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não ha clientes Cadastrados: "+ex.getMessage()+ex.getSQLState());
        }
        finally{
            //como o método retorna um resultset, se eu fechar a conexão me da um erro pois o resultset esta fechado
            //sera que o problema pode ser esse?
           return rs;           
        }
       }
      
       public ResultSet carregaAgenda(String data){
           String query;
           if(data.length()==10)
                query="Select * from agenda where data='"+data+"'";
           else               
                query="Select * from agenda where data like'"+data+"%'";          
           ResultSet rs=null;
        try {
            con = new Conexao().criaConexao();
            stm =con.createStatement();
            rs = stm.executeQuery(query);
            return rs;

        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não ha clientes Cadastrados: "+ex.getMessage()+ex.getSQLState());
        }
        finally{
           //aqui a mesma coisa, se eu fechar a conexão, da um erro, dizendo que o resultset esta vazio ou nulo
           return rs;           
        }
       }
       
       public void alteraAgenda(int id, String nome, String doutor, String data, String hora){
              String sql="UPDATE agenda SET Nome=?, doutor=? data=? hora=? WHERE id=?";

            try{
                con = new Conexao().criaConexao();
                pstm =con.prepareStatement(sql);
                
                pstm.setString(1,nome);
                pstm.setString(2, doutor);
                pstm.setString(3, data);
                pstm.setString(4, hora);
                pstm.setInt(5, id);
                pstm.executeUpdate();

             JOptionPane.showMessageDialog(null, "Agenda alterada com sucesso");
             this.desconectar();

             }
            catch (SQLException e){
                JOptionPane.showMessageDialog(null, "Problema ao alterar agenda: "+e.getMessage());
            }

       }

       public void excluirCliente(int id){
            String sql="Delete FROM Cliente WHERE ID=?";

            try{
                con = new Conexao().criaConexao();
                pstm =con.prepareStatement(sql);
                pstm.setInt(1,id);

                pstm.executeUpdate();

             //JOptionPane.showMessageDialog(j, "Cliente Excluído");
             this.desconectar();

             }
            catch (SQLException e){
                JOptionPane.showMessageDialog(null, "Problema ao conectar na classe AgendaDAO! "+e.getMessage());
            }
       }
       
       
       public void desconectar(){
            try{
                if(con!=null)
                    con.close();
                if(stm!=null)
                    stm.close();
            }
            catch (SQLException sqle){
                JOptionPane.showMessageDialog(null, "Problema ao desconectar!" +sqle.getMessage());
            }
        }
    
}

Aqui a Servelet:

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JOptionPane;

public class Agenda extends HttpServlet{
    
  @Override
   public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException {

       int opc=Integer.parseInt(request.getParameter("operacao")); 
       JOptionPane.showMessageDialog(null, "Este é o número da opção: "+opc);
        if(opc==1){
            AgendaDAO agenda=new AgendaDAO();
            ResultSet rs=agenda.carregaAgenda();
            
            response.setContentType("text/html");           
            PrintWriter out = response.getWriter();

            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");  
            String data=sdf.format( new java.util.Date());             
             
                 out.println("<h1 id='dia'>Dia "+data+"</h1>");
                 out.println("<div class='table' id='tabela_agenda'>"); 
                 out.println("<table class='tabela'>");
                 out.println("<thead>");
                 out.println("<tr id='first_line'>");
                 out.println("<td class='time'>Horário</td><td>Paciente</td><td>Doutor</td><td class='situation'>Situação</td><td class='edit'>Editar</td");
                 out.println("></tr>");
                 out.println("</thead>");
                 out.println("<tbody>");             
                 try{ 
                     while(rs.next()){                     

                         //pega o estatus e devolve em String
                         boolean sta=rs.getBoolean(6);
                         String status=getStatus(sta);

                         out.println("<tr><td>"+rs.getString(4)+"</td>");
                         out.println("<td>"+rs.getString(2)+"</td>");
                         out.println("<td>"+rs.getString(5)+"</td>");
                         out.println("<td>"+status+"</td>");
                         out.println("&lt;td&gt;&lt;input type='hidden' value='"+rs.getString(1)+"' /&gt;<a  ><img  /></a>&lt;/td&gt;&lt;/tr&gt;");                          
                     }
                }
                 catch(SQLException e){
                     out.println("&lt;h1 style='color:red; font-size:30px'&gt;Não foi possível carregar a agenda: "+ e.getMessage()+"&lt;/h1&gt;");
                 }  
             out.println("&lt;/tbody&gt;");
             out.println("&lt;/table&gt;");
             out.println("&lt;/div&gt;");
             out.println("&lt;div id='form_search'&gt;");                                
             out.println("&lt;input type='text' name='data' id='campo_de_procura' value='Insira uma data aqui' onmouseover='limpaTexto()' onmouseout='carregaTexto()' /&gt;<br />");
             out.println("&lt;input type='submit' id='buscar_data' value='Procurar' onclick='buscaData()' /&gt;");             
             out.println("&lt;/div&gt;");
             out.println("&lt;div id='pagination'&gt;");
             out.println("&lt;div id='previous'&gt;");
             out.println("<a  >&laquo;Anterior</a>");
             out.println("&lt;/div&gt;");
             out.println("&lt;div id='next'&gt;");
             out.println("<a  >Próximo&raquo;</a>");
             out.println("&lt;/div&gt;");                    
             out.println("&lt;/div&gt;&quot;);
        }  
        
        if(opc==2){            
             String data=request.getParameter(&quot;data&quot;);
            
            //formata a data caso a pessoa só tenha digitado o dia, ou o mês
            if(request.getParameter(&quot;data&quot;).length()&lt;3){
                SimpleDateFormat sdf = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);  
                data=sdf.format( new java.util.Date());
                data=request.getParameter(&quot;data&quot;)+data.substring(2, 10);
                //JOptionPane.showMessageDialog(null, data);
            }
            else{            
                if(request.getParameter(&quot;data&quot;).length()&gt;=3 && request.getParameter(&quot;data&quot;).length()&lt;6){
                    SimpleDateFormat sdf = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);  
                    data=sdf.format( new java.util.Date());
                    data=request.getParameter(&quot;data&quot;)+data.substring(5, 10);
                    //JOptionPane.showMessageDialog(null, data);
                }               
            }
            JOptionPane.showMessageDialog(null, &quot;Esta funcionando&quot;);
            
            AgendaDAO agenda=new AgendaDAO();            
            ResultSet rs=agenda.carregaAgenda(data);            
         
            response.setContentType(&quot;text/html&quot;);           
            PrintWriter out = response.getWriter();
                
                 //out.println(&quot;&lt;h1 id='dia'&gt;Dia "+data+"&lt;/h1&gt;");
                 //out.println("&lt;div class='table' id='tabela_agenda'&gt;"); 
                 out.println("&lt;table class='tabela'&gt;");
                 out.println("&lt;thead&gt;");
                 out.println("&lt;tr id='first_line'&gt;");
                 out.println("&lt;td class='time'&gt;Horário&lt;/td&gt;&lt;td&gt;Paciente&lt;/td&gt;&lt;td&gt;Doutor&lt;/td&gt;&lt;td class='situation'&gt;Situação&lt;/td&gt;&lt;td class='edit'&gt;Editar&lt;/td");
                 out.println("&gt;&lt;/tr&gt;");
                 out.println("&lt;/thead&gt;");
                 out.println("&lt;tbody&gt;");             
                 try{ 
                     while(rs.next()){                     

                         //pega o estatus e devolve em String
                         boolean sta=rs.getBoolean(6);
                         String status=getStatus(sta);

                         out.println("&lt;tr&gt;&lt;td&gt;"+rs.getString(4)+"&lt;/td&gt;");
                         out.println("&lt;td&gt;"+rs.getString(2)+"&lt;/td&gt;");
                         out.println("&lt;td&gt;"+rs.getString(5)+"&lt;/td&gt;");
                         out.println("&lt;td&gt;"+status+"&lt;/td&gt;");
                         out.println("&lt;td&gt;&lt;input type='hidden' value='"+rs.getString(1)+"' /&gt;<a  ><img  /></a>&lt;/td&gt;&lt;/tr&gt;");                          
                     }
                }
                 catch(SQLException e){
                     out.println("&lt;h1 style='color:red; font-size:30px'&gt;Não foi possível carregar a agenda: "+ e.getMessage()+"&lt;/h1&gt;");
                 }  
             out.println("&lt;/tbody&gt;");
             out.println("&lt;/table&gt;");
             out.println("&lt;/div&gt;");
             out.println("&lt;div id='form_search'&gt;");                                
             out.println("&lt;input type='text' name='data' id='campo_de_procura' value='Insira uma data aqui' onmouseover='limpaTexto()' onmouseout='carregaTexto()' /&gt;<br />");
             out.println("&lt;input type='submit' id='buscar_data' value='Procurar' onclick='buscaData()' /&gt;");             
             out.println("&lt;/div&gt;");
             out.println("&lt;div id='pagination'&gt;");
             out.println("&lt;div id='previous'&gt;");
             out.println("<a  >&laquo;Anterior</a>");
             out.println("&lt;/div&gt;");
             out.println("&lt;div id='next'&gt;");
             out.println("<a  >Próximo&raquo;</a>");
             out.println("&lt;/div&gt;");                    
             out.println("&lt;/div&gt;");
        }            
        
   }
  
   public String getStatus(boolean b){
            String resp="";
            if(b)
                resp="Confirmado";
            else
                resp="A Confirmar";
            
            return resp;
   }

}

este é o código javascript que faz a requisição quando a página jsp carrega:

$('#tab1').load('http://localhost:8080/Agenda?operacao=1', function() { $('.tabela').columnFilters()});

este é o código que faz a busca quando o usuario clica em procurar na página JSP:

var data=document.getElementById('dia').firstChild.nodeValue;
$('#tab1').load('http://localhost:8080/Agenda?operacao=2&data='+data, function() { $('#tabela_agenda .tabela').columnFilters()});

a função que vai dentro da requisição, é apenas uma função de callback, pra realizar um filtro na tabela que exibe os dados, depois que ela é carregada via Ajax
e data é uma variável

Tem como saber pelo sistema operacional se tem varias conexões abertas?
essas conexões ficam abertas mesmo após desligar o PC?

Obrigado pela ajuda

2 Respostas

FernandoFranzini

Vamos la
1)No desktop é uma coisa…na web é outra.
2) Na web usamos pool e não ficamos abrindo conexão por request - por ser uns dos motivos da lentidão.
3) Alem de abrir no request vc não ta fechando as conexão…ou seja…vai aculumando isso - por ser uns dos motivos da lentidão.
4) Acess não é um banco de dados…não tem um manager para ver as conexões ativas…aconselho vc a migrar para um banco de verdade…MySQL ja resolve.
5) To vendo que algumas praticas ruins no codigo JDBC…retornando ResultSet…não pode!! Na web, trabalhamos com CachedRowSet juntamente com Pool, por motivos de escalabilidade…

Bruno_Ferreira1

FernandoFranzini:
Vamos la
1)No desktop é uma coisa…na web é outra.
2) Na web usamos pool e não ficamos abrindo conexão por request - por ser uns dos motivos da lentidão.
3) Alem de abrir no request vc não ta fechando as conexão…ou seja…vai aculumando isso - por ser uns dos motivos da lentidão.
4) Acess não é um banco de dados…não tem um manager para ver as conexões ativas…aconselho vc a migrar para um banco de verdade…MySQL ja resolve.
5) To vendo que algumas praticas ruins no codigo JDBC…retornando ResultSet…não pode!! Na web, trabalhamos com CachedRowSet juntamente com Pool, por motivos de escalabilidade…

2 -Vou dar uma pesquisada sobre Pool de conexões
3 - Expliquei que o problema era por estar retornando um resultset, não estava conseguindo fechar a conexão, pois dava erro, mas vou pesquisar sobre os itens que você passou na linha 5
4 - É um projeto da escola, tipo um TCC. O Professor falou que era pra utilizar um banco Oracle que a faculdade tem hospedado na internet, mas ele ainda não passou os dados da conexão,
por isso, estou fazendo com Access apenas pra ir testando e tentar “adiantar o serviço”, já que ainda estamos na fase de documentação, vai sobrar pouco tempo pra fazer a programação e entregar até o começo de Dezembro
5 - ja falei no 3

Muito obrigado pela ajuda

Criado 8 de setembro de 2011
Ultima resposta 9 de set. de 2011
Respostas 2
Participantes 2