2. Dicas e truques de performance em
JPA e EJB
Danival Taffarel Calegari
MATERA Systems
3. Sobre os palestrantes
Danival Taffarel Calegari
Mestre em Ciê
ncia da Computaç ã pela UNICAMP.
o
Trabalha com tecnologia Java EE desde 2002. Atua a mais de 4 anos
com líder té cnico na MATERA Systems.
Atua hámais de 5 anos como instrutor da Globalcode.
Palestras em eventos nacionais e internacionais: JustJava, TCD,
JavaOne.
Participa do programa “Adopt a JSR” do SouJava (JSR 352).
Certificaç õ SCJP, SCWCD, SCBCD.
es:
5. Introduç ão
Performance é um requisito nã funcional chave para
o
conseguirmos os outros.
Serve como “moeda” para “comprar” linguagens mais expressivas,
melhores interfaces com usuá maior nú
rio, mero de funcionalidades,
frameworks gené ricos, etc.
Influenciado pela escolha dos algoritmos, complexidade do
problema, volume de dados manipulados.
Aspectos de programaç ã també m tem grande impacto no
o
desempenho da aplicaç ão.
O uso de mecanismos inadequados ao problema pode prejudicar muito
a performance.
Demo: ordenaç ã de registro em arquivo.
o
6. Introduç ão
“ We should forget about small efficiencies, say about 97% of
the time: premature optimization is the root of all evil”
Donald Knuth
7. Profiling
Dica: Realize mediç õ antes de fazer otimizaç õ
es es.
Procure determinar os pontos de gargalo da aplicaç ão.
Resolver um ponto crítico traz muito benefício com pouco esforç o.
Quando possível, utilize profilers.
VisualVM que vem no JDK desde a versã 6 u7.
o
NetBeans Profiler.
Siga as trê etapas abaixo:
s
Intuiç ão.
Mediç ão.
Correç ão.
8. JPA
Dica: Prefira usar consultas parametrizadas a
concatenar o valor dos parâ metros no JPQL para
permitir cache de consultas.
"select p from Payment p where p.customer.id="+custId
Como cada consulta tem um texto diferente, o cache de
consultas nã se torna eficiente.
o
"select p from Payment p where p.customer.id=:custId"
Esta soluç ã possui desempenho semelhante ao das
o
NamedQuery no EclipseLink.
9. 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.
11. 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ç ã de resultados;
o
Causa problemas com paginaç ã em banco de dados.
o
13. Lazy vs Eager
Dica: Procure fazer paginaç ão em banco de dados
usando estraté gia lazy quando 1:N.
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!
15. Lazy vs Eager
Dica: Procure usar eager quando sempre for processar
todos os dados de uma vez.
Uma situaç ã comum é geraç ã de relató rios.
o o
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.
O Hibernate possui o recurso de “scroll” , onde ele manté m o
ResultSet aberto e consulta um objeto por vez.
16. 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”.
18. 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).
20. 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ç ã externa altere o banco de dados, os
o
dados das entidades em cache de segundo nível ficam
desatualizados.
Procure colocar um tempo má
ximo de validade para os dados.
21. Cache
Dica: Use cache de resultado de consultas caso as
consultas sejam feitas com um conjunto restrito de
valores.
Nã é um recurso padrã mas grande parte dos providers JPA
o o,
oferecem um recurso deste.
Armazena os ids dos objetos consultados vinculados com os
parâ
metros.
Quando uma consulta é feita pelos mesmos parâ
metros, játem o
resultado pronto.
Cuidado com a política de exclusã de objetos do cache.
o
Pode levar a problemas de consumo excessivo de memó ria.
22. EJB
Dica: Evite transaç õ desnecessárias usando os
es
atributos de propagaç ão de transaç ão apropriados.
Existem seis formas de propagaç ã de transaç ã
o o:
Required (default)
Requires New
Mandatory
Not Supported
Supports
Never
Caso o mé todo nã utilize recursos transacionais, coloque como
o
“ Not Supported” ou mesmo “ Supports” para evitar iniciar
transaç õ desnecessariamente.
es
23. EJB
Dica: Reduza o custo de serializaç ão de
desserializaç ão de objetos marcando atributos como
transient.
Instâ
ncias de Session Bean que sã Stateful podem ser
o
armazenados no disco e removidos da memó ria quando não
estã em uso.
o
Passivation
Em chamadas remotas os objetos passados como parâ metro e
retornados també m passam por serializaç ão/desserializaç ão.
Procure deixar os atributos simples (evite á
rvores de objetos).
Sempre que possível, coloque os atributos como transientes
(cuidado com valores nulos apó s a desserializaç ão).
24. Referências
Java Performance
Charlie Hunt, Binu John. Prentice Hall. Outubro, 2011.
VisualVM Profiler
http://visualvm.java.net
Apresentaç ão do JavaOne 2010
http://www.slideshare.net/drspockbr/performance-tips-and-tricks-java-ee-
java-persistence-api-and-javaserver-faces
Curso: Introduç ão a Algorítmos MIT (Portal Veduca)
http://www.veduca.com.br/play?v=381&t=0016%20&p=Algoritmos