SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
Dicas e Truques sobre Performance em Java EE, JPA e JSF
Dicas e Truques sobre Performance em Java EE, JPA e JSF
1.
Dicas e Truques sobre performance
em Java EE, JPA e JSF
Alberto Lemos (Dr. Spock) Danival Taffarel Calegari
Instrutor Globalcode Instrutor Globalcode
Senior Software Architect Senior Software Architect
Globalcode – Open4education
2.
Agenda
Motivação
Estratégias de recuperação de dados
Lazy vs Eager
Cache
Estratégias de design de web UI
Escopo de conversação
Uso de lazy UI components
View Helper + serviço de pesistência
Globalcode – Open4education
3.
Objetivo
“Apresentar algumas dicas para o
desenvolvimento de aplicações web com
JSF, Ajax e JPA”
Globalcode – Open4education
4.
Motivação
JavaServer Faces (JSF) representa uma mudança
de paradigma de desenvolvimento Web com Java
EE;
Estabelece modelo de componentes UI na web;
JSF evoluiu!
JSF 1.x (sem AJAX) => Orientado a requisições
JSF 1.x + lib AJAX => Orientado a eventos
JSF 2.x => Orientado a eventos
Necessário evoluir técnicas de desenvolvimento
nas camada de apresentação e persistência!
Globalcode – Open4education
5.
Agenda
Motivação
Estratégias de recuperação de dados
Lazy vs Eager
Cache
Estratégias de design de web UI
Escopo de conversação
Uso de lazy UI components
View Helper + serviço de pesistência
Globalcode – Open4education
6.
Lazy vs Eager
Lazy: só recupera um dado quando necessário.
Eager: recupera o dado sempre.
Globalcode – Open4education
7.
Lazy vs Eager
Dica: O JPA permite que a mudança de lazy
para eager seja feita no JPQL;
select distinct c from Categoria c join fetch c.produtos
Faz um único SELECT no banco de dados;
O join fetch resolve o problema do N+1;
Deve-se usar distinct para evitar replicação de
resultados;
Causa problemas com paginação em banco de
dados.
Globalcode – Open4education
8.
Lazy vs Eager
Dica: Procure fazer paginação em banco de
dados usando estratégia lazy;
Use os métodos setFirstResult e setMaxResults da
Query.
O provedor JPA vai usar comandos de banco de
dados para limitar a consulta;
O uso de join fetch para relacionamentos 1:N
provoca problemas de desempenho e de memória.
WARN: firstResult/maxResults specified with collection
fetch; applying in memory!
Globalcode – Open4education
9.
Lazy vs Eager
Dica: Procure usar eager quando sempre for
processar todos os dados de uma vez;
Uma situação comum é geração de relatórios.
Cuidado com o uso de memória;
Faça uma consulta prévia para recuperar somente os ids
e faça várias consultas com in;
Chame o método clear do EntityManager para remover
os objetos já utilizados da memória.
Globalcode – Open4education
10.
Cache
Cache de primeiro nível
Enquanto o EntityManager estiver aberto, ele armazena
os objetos carregados por ele;
Este cache é apagado quando o método clear é
chamado.
Cache de segundo nível
Armazena os objetos por EntityManagerFactory;
Cache “por aplicação”.
Globalcode – Open4education
11.
Cache
EntityManagerFactory
Cache nível 2
EntityManager EntityManager EntityManager
Cache nível 1 Cache nível 1 Cache nível 1
Globalcode – Open4education
12.
Cache
Truque: Faça uma carga prévia das entidades
relacionadas no cache de primeiro nível antes
da consulta principal;
Consultas a objetos que possuem relacionamentos N:1
com entidades com um número pequeno de instâncias.
Exemplo: Buscar produtos com preço menor que x.
Se existirem 200 categorias, a estratégia lazy irá fazer
200 consultas na tabela de categorias;
Executar um “select c from Categoria c” antes da
consulta por produtos.
Globalcode – Open4education
13.
Cache
Dica: Use cache de segundo nível para diminuir
o consumo de memória e melhorar o
desempenho;
Procure colocar entidades alteradas com pouca
frequência;
Caso alguma aplicação externa altere o banco de
dados, os dados das entidades em cache de
segundo nível ficam desatualizados.
Procure colocar um tempo máximo de validade para os
dados.
Globalcode – Open4education
14.
Agenda
Motivação
Estratégias de recuperação de dados
Lazy vs Eager
Cache
Estratégias de design de web UI
Escopo de conversação
Uso de lazy UI components
View Helper + serviço de pesistência
Globalcode – Open4education
15.
Estratégias de Web UI
Dica: Aplicar o escopo View ou Conversation;
Evita o uso da Session para objetos com tempo de vida
menor;
Geralmente o tempo de vida é gerenciado pelo container
mediante configurações (Anotações ou XML);
Globalcode – Open4education
16.
Estratégias de Web UI
Dica: Manter o contexto de persistência no
escopo view ou conversation;
EntityManager permanecem abertos por um tempo
controlado;
Globalcode – Open4education
17.
Estratégias de Web UI
Dica: Manter o contexto de persistência no
escopo view ou conversation;
EntityManager permanecem abertos por um tempo
controlado;
Viabiliza cache de 1º nível;
Elimina erros de LazyInitializationException;
Viabiliza paginação na camada de apresentação
integrado à camada de persistência;
Cuidado: Tamanho do cache de 1º nível para
conversação de longa duração.
Globalcode – Open4education
18.
Estratégias de Web UI
Dica: Uso de componentes com suporte a “lazy
loading” via Ajax;
Globalcode – Open4education
19.
Estratégias de Web UI
Dica: Uso de componentes com suporte a “lazy
loading” via Ajax;
Globalcode – Open4education
20.
Estratégias de Web UI
Dica: Uso de componentes com suporte a “lazy
loading” via Ajax;
Globalcode – Open4education
21.
Estratégias de Web UI
Dica: Integrar View Helper com o serviço de
persistência;
Implementação de List recebendo Query (JPA);
Implementação de DataModel (JSF) recebendo Query;
Implementação de ExtendedTableDataModel
(Richfaces) recebendo EntityManager;
Paginação: Use setFirstResult() e setMaxResults(), mas
cuidado com o Earger!
Ordenação e Filtro: Use CriteriaBuilder (JPA).
Vídeo demo: 001
Globalcode – Open4education