Slides da apresentação realizada no JavaOne Brasil 2010. Apresenta algumas dicas e truques para evitar problemas de performance em aplicações Web baseadas em Ajax, JSF e JPA.
Dicas e truques sobre performance em JavaEE, JPA e JSF
1. Dicas e Truques sobre performance
em Java EE, JPA e JSF
Alberto Lemos (Dr. Spock) Danival Taffarel Calegari
Senior Software Architect Arquiteto na MATERA Systems
Globalcode Instructor Instrutor Globalcode
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
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
Estratégias para recuperar os objetos “do outro
lado” de um relacionamento
Lazy: só recupera um dado quando necessário.
Eager: recupera o dado sempre.
Globalcode – Open4education
8. 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
10. 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 nativos 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
12. 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
13. Cache
First level cache
Enquanto o EntityManager estiver aberto, ele armazena
os objetos carregados por ele;
Este cache é apagado quando o método clear é
chamado.
Second level cache
Armazena os objetos por EntityManagerFactory;
Cache “por aplicação”.
Globalcode – Open4education
15. 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.
Executar um “select c from Categoria c” antes da
consulta por produtos.
Recomendado em caso de entidades com complexidade
de carga grande (pode-se usar join fetch).
Globalcode – Open4education
17. 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
18. 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
19. O Problema
DAO + JDBC => abrir/fechar conexão;
DAO + Persistence Context => abrir/fechar sessão;
LazyInitializationException!
Globalcode – Open4education
21. Novos Problemas
OpenSessionInViewFilter Design Pattern;
1st REQUEST 2nd REQUEST Nth REQUEST
Cada requisição usa um contexto de persistência
diferente;
Entidades na sessão web podem lançar exceções;
LazyInitializationException!
Globalcode – Open4education
22. Web 1.0
Aplicações Web orientadas a requisições;
Globalcode – Open4education
24. 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
25. Estratégias de Web UI
Dica: Manter o contexto de persistência no
escopo view ou conversation;
EntityManager permanece aberto por um tempo
controlado;
Globalcode – Open4education
26. 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
27. Estratégias de Web UI
Dica: Integrar View Helper com o serviço de
persistência;
Implementação de List (Coleções) 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).
Globalcode – Open4education
28. Estratégias de Web UI
Dica: Uso de componentes com suporte a “lazy
loading” via Ajax;
Globalcode – Open4education
29. Estratégias de Web UI
Dica: Uso de componentes com suporte a “lazy
loading” via Ajax;
Globalcode – Open4education
30. Estratégias de Web UI
Dica: Uso de componentes com suporte a “lazy
loading” via Ajax;
Globalcode – Open4education
31. Aplicação Exemplo
As dicas e truques são demonstradas numa
aplicação exemplo;
Download disponível:
http://sourceforge.net/projects/j1catalogproto2/
Globalcode – Open4education