Dicas e truques sobre performance em JavaEE, JPA e JSF

10,046 views

Published on

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.

Published in: Technology

Dicas e truques sobre performance em JavaEE, JPA e JSF

  1. 1. Dicas e Truques sobre performance em Java EE, JPA e JSFAlberto Lemos (Dr. Spock) Danival Taffarel Calegari Senior Software Architect Arquiteto na MATERA Systems Globalcode Instructor Instrutor Globalcode Globalcode – Open4education
  2. 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. 3. Objetivo“Apresentar algumas dicas e truques para o desenvolvimento de aplicações web com JSF, AJAX e JPA.” Globalcode – Open4education
  4. 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. 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. 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. 7. Lazy vs EagerProblema do N + 1 Globalcode – Open4education
  8. 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
  9. 9. Lazy vs Eager Globalcode – Open4education
  10. 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
  11. 11. Lazy vs Eager cat1 cat2 cat3 cat4 Globalcode – Open4education
  12. 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. 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
  14. 14. Cache Globalcode – Open4education
  15. 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
  16. 16. Cache Globalcode – Open4education
  17. 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. 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. 19. O Problema DAO + JDBC => abrir/fechar conexão; DAO + Persistence Context => abrir/fechar sessão; LazyInitializationException! Globalcode – Open4education
  20. 20. Solução antiga OpenSessionInViewFilter Design Pattern; Novos problemas! Globalcode – Open4education
  21. 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. 22. Web 1.0 Aplicações Web orientadas a requisições; Globalcode – Open4education
  23. 23. Web 2.0 Aplicações Web orientadas a AJAX; Globalcode – Open4education
  24. 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. 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. 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. 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. 28. Estratégias de Web UI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  29. 29. Estratégias de Web UI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  30. 30. Estratégias de Web UI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  31. 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
  32. 32. Obrigado!Alberto Lemos (Dr. Spock) Danival Taffarel Calegarihttp://www.globalcode.com.br/ http://www.matera.com/spock@globalcode.com.br danival@globalcode.com.brhttp://twitter.com/drspockbr http://twitter.com/danivaltc Globalcode – Open4education

×