Computação Física com Arduino/Program-ME e a Plataforma Java
Dicas JSF, JPA e Desempenho
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