Dicas e truques sobre performance em JavaEE, JPA e JSF

Dr. Spock
Dr. SpockSenior Software Architect at SpockNET
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
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
Objetivo




“Apresentar algumas dicas e truques para
 o desenvolvimento de aplicações web
        com JSF, AJAX e JPA.”



                             Globalcode – Open4education
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
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
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
Lazy vs Eager

Problema do N + 1




                    Globalcode – Open4education
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
Lazy vs Eager




                Globalcode – Open4education
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
Lazy vs Eager

          cat1




          cat2


          cat3


          cat4



                 Globalcode – Open4education
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
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
Cache




        Globalcode – Open4education
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
Cache




        Globalcode – Open4education
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
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
O Problema
 DAO + JDBC => abrir/fechar conexão;
 DAO + Persistence Context => abrir/fechar sessão;




 LazyInitializationException!
                                    Globalcode – Open4education
Solução antiga
  OpenSessionInViewFilter Design Pattern;




  Novos problemas!

                                   Globalcode – Open4education
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
Web 1.0
 Aplicações Web orientadas a requisições;




                                    Globalcode – Open4education
Web 2.0
 Aplicações Web orientadas a AJAX;




                                     Globalcode – Open4education
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
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
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
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
Estratégias de Web UI
 Dica: Uso de componentes com suporte a “lazy
 loading” via Ajax;




                                 Globalcode – Open4education
Estratégias de Web UI
 Dica: Uso de componentes com suporte a “lazy
 loading” via Ajax;




                                 Globalcode – Open4education
Estratégias de Web UI
 Dica: Uso de componentes com suporte a “lazy
 loading” via Ajax;




                                 Globalcode – Open4education
Aplicação Exemplo
 As dicas e truques são demonstradas numa
 aplicação exemplo;
 Download disponível:
 http://sourceforge.net/projects/j1catalogproto2/




                                    Globalcode – Open4education
Obrigado!

Alberto Lemos (Dr. Spock)       Danival Taffarel Calegari
http://www.globalcode.com.br/   http://www.matera.com/
spock@globalcode.com.br         danival@globalcode.com.br
http://twitter.com/drspockbr    http://twitter.com/danivaltc




                                             Globalcode – Open4education
1 of 32

More Related Content

What's hot(19)

Construindo aplicações web java com netbeansConstruindo aplicações web java com netbeans
Construindo aplicações web java com netbeans
Sliedesharessbarbosa38.2K views
Web Scale Data ManagementWeb Scale Data Management
Web Scale Data Management
Regis Magalhães1K views
PHP 10 CodeIgniterPHP 10 CodeIgniter
PHP 10 CodeIgniter
Regis Magalhães4.1K views
Programação Desktop: Uma abordagem com JavaProgramação Desktop: Uma abordagem com Java
Programação Desktop: Uma abordagem com Java
Rosicleia Frasson1.4K views
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?
Anderson Araújo21.2K views
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
Eduardo Mendes24.2K views
Java Web, o TutorialJava Web, o Tutorial
Java Web, o Tutorial
Rildo (@rildosan) Santos6.8K views
Aula parte 1 de JSF 2.2Aula parte 1 de JSF 2.2
Aula parte 1 de JSF 2.2
André Luiz Forchesatto1.8K views
Java Web 1 IntroducaoJava Web 1 Introducao
Java Web 1 Introducao
Eduardo Mendes1.9K views
Jsp+Jdbc+ServletsJsp+Jdbc+Servlets
Jsp+Jdbc+Servlets
Sávio Carvalho1.5K views
JSF com PrimefacesJSF com Primefaces
JSF com Primefaces
Fabio Noth12.8K views
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniter
Anderson Gonçalves561 views
Minicurso Java Server FacesMinicurso Java Server Faces
Minicurso Java Server Faces
João Longo5.8K views
Java Web Dev IntroduçãoJava Web Dev Introdução
Java Web Dev Introdução
Marcio Marinho2.4K views

Viewers also liked(14)

Reverse Ajax DwrReverse Ajax Dwr
Reverse Ajax Dwr
Handerson Frota1.4K views
Viber - Como usa-lo em seu SmartphoneViber - Como usa-lo em seu Smartphone
Viber - Como usa-lo em seu Smartphone
Bruno Paulino1.2K views
Api First - A AbordagemApi First - A Abordagem
Api First - A Abordagem
Bruno Paulino656 views
JSF 2 Components JustJava2011JSF 2 Components JustJava2011
JSF 2 Components JustJava2011
Eder Magalhães811 views
Graficos com PrimeFacesGraficos com PrimeFaces
Graficos com PrimeFaces
Bruno Paulino3.2K views
REST com JSF 2 e HTML 5REST com JSF 2 e HTML 5
REST com JSF 2 e HTML 5
Vinicius Rodrigues Nunes2.3K views
Rest web services com JavaRest web services com Java
Rest web services com Java
jesuinoPower3.5K views
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7
Claudio Martins29.4K views
Arquitetura MVC, JavaBeans e DAOArquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAO
Leonardo Sousa7K views

Similar to Dicas e truques sobre performance em JavaEE, JPA e JSF(20)

More from Dr. Spock(20)

TDC2011: Spring MobileTDC2011: Spring Mobile
TDC2011: Spring Mobile
Dr. Spock628 views
TDC2011: Java EE 6 & AzureTDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & Azure
Dr. Spock513 views

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
  • 9. Lazy vs Eager 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
  • 11. Lazy vs Eager cat1 cat2 cat3 cat4 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
  • 14. Cache 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
  • 16. Cache 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
  • 20. Solução antiga OpenSessionInViewFilter Design Pattern; Novos problemas! 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
  • 32. Obrigado! Alberto Lemos (Dr. Spock) Danival Taffarel Calegari http://www.globalcode.com.br/ http://www.matera.com/ spock@globalcode.com.br danival@globalcode.com.br http://twitter.com/drspockbr http://twitter.com/danivaltc Globalcode – Open4education