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 JavaEE, JPA e JSF
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.
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
3.
Objetivo
“Apresentar algumas dicas e truques 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
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
7.
Lazy vs Eager
Problema do N + 1
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
23.
Web 2.0
Aplicações Web orientadas a AJAX;
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