Otimizar carregamento de JSP

9 respostas Resolvido
htmljavamysql
bruno_i25

Possuo uma pagina principal (em JSP) que retorna uma lista de objetos, com 7 atributos cada objeto.Para cada objeto faço dois selects para calcular um valor.O grande porém é que minha pagina principal está lenta para carregar.Criei índices para tabela destes objetos mas mesmo assim continua lenta ao carregar pela primeira vez e/ou ao fazer o redirecionamento de volta.Alguém tem alguma dica para torná-la mais rápida? OBS*: não consigo reduzir mais os selects e pego realmente apenas aquilo que preciso

9 Respostas

darlan_machado

Ajax?
Mudar o front de JSP para alguma tecnologia mais recente?

bruno_i25

Ajax eu utilizo apenas para Pop’ups.O front-end é razoavelmente simples,o problema está no back-end.Gostaria de otimizar as queries entende?

javaflex

Se já sabe que o problema está na query, então não coloque no post que é problema do carregamento da JSP.

Como está o plano de execução do select? Pelo menos poste o SQL.

Por que não faz apenas um select? Se for muito complexo, pode criar uma function ou stored procedure.

bruno_i25
sql = "select count(ia.ID_GAR)AS qtdAut, count(lb.ID_GAR) AS qtdLb,count(inf.ID_GAR)AS qtdInf  from garantias as g 
                        + left join itens_automotivo as ia on g.ID_GARANTIA=ia.ID_GAR
                        + left join itens_linhabranca as lb on g.ID_GARANTIA=lb.ID_GAR
                        + left join itens_informatica as inf on g.ID_GARANTIA=inf.ID_GAR where g.ID_GARANTIA= + idgar;"
                comando = con.prepareStatement(sql);
                ResultSet rs2 = comando.executeQuery();
                while (rs2.next()) {
                    qtdAut = rs2.getDouble("qtdAut");
                    qtdLb = rs2.getDouble("qtdLb");
                    qtdInf = rs2.getDouble("qtdInf");
                }
                rs2.close();
                comando.close();
                if (qtdAut + qtdInf + qtdLb > 0) {
                    if (qtdAut > 0) {
                        tot = qtdAut;
                        sql = "select count(iae.ID_GAR)AS fin from garantias as g "
                                + "left join itens_automotivo as iae on g.ID_GARANTIA=iae.ID_GAR where g.ID_GARANTIA=" + idgar + " and iae.LAUDO=1";
                    }
                    if (qtdLb > 0) {
                        tot = qtdLb;
                        sql = "select count(iae.ID_GAR)AS fin from garantias as g "
                                + "left join itens_linhabranca as iae on g.ID_GARANTIA=iae.ID_GAR where g.ID_GARANTIA=" + idgar + " and iae.LAUDO=1";
                    }
                    if (qtdInf > 0) {
                        tot = qtdInf;
                        sql = "select count(iae.ID_GAR)AS fin from garantias as g "
                                + "left join itens_informatica as iae on g.ID_GARANTIA=iae.ID_GAR where g.ID_GARANTIA=" + idgar + " and iae.LAUDO=1";
                    }
                    comando = con.prepareStatement(sql);
                    rs2 = comando.executeQuery();
                    while (rs2.next()) {
                        fin = rs2.getDouble("fin");
                    }
                    rs2.close();
                    comando.close();
                    DecimalFormatSymbols dfs = new DecimalFormatSymbols();
                    dfs.setDecimalSeparator('.');
                    DecimalFormat df = new DecimalFormat("0.00", dfs);
                    gar.setPROGRESSO(Double.valueOf(df.format((fin / tot) * 100)));

O problema está aqui,com o resultado do primeiro select irei verificar qual tabela farei outro select pra calcular o valor.Este processo deve estar causando lentidão na página.

javaflex

Qual query está levando mais tempo? Já deu uma olhada no plano de execução da query?

Em último caso poderia fazer uma stored procedure, processando tudo que for necessário para o resultado de uma vez só no banco.

Mike

A sua query tem o sinal +, põem o + fora das aspas
Ex:

"Query "
+ "left join ..."
bruno_i25

Como posso ver o plano de execução da query?

javaflex

E visualmente com a ferramenta Workbench:
https://dev.mysql.com/doc/workbench/en/wb-tutorial-visual-explain-dbt3.html

bruno_i25
Solucao aceita

Consegui reduzir a quantidade de selects agora está mais rápido.

Criado 23 de março de 2018
Ultima resposta 28 de mar. de 2018
Respostas 9
Participantes 4