Otimizar carregamento de JSP

9 respostas Resolvido
htmljavamysql
B

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

D

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

B

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

J

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.

B
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.

J

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.

M

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

"Query "
+ "left join ..."
B

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

J

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

B
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