Dicas e Truques sobre performance
      em Java EE, JPA e JSF
Alberto Lemos (Dr. Spock)    Danival Taffarel Calegari
   Instrutor Globalcode        Instrutor Globalcode
 Senior Software Architect   Senior Software Architect


                                     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 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
 Lazy: só recupera um dado quando necessário.
 Eager: recupera o dado sempre.




                                  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
 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 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
 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
 Cache de primeiro nível
   Enquanto o EntityManager estiver aberto, ele armazena
   os objetos carregados por ele;
   Este cache é apagado quando o método clear é
   chamado.
 Cache de segundo nível
   Armazena os objetos por EntityManagerFactory;
   Cache “por aplicação”.




                                        Globalcode – Open4education
Cache

                  EntityManagerFactory


                     Cache nível 2




  EntityManager      EntityManager          EntityManager


  Cache nível 1      Cache nível 1           Cache nível 1




                                         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 com preço menor que x.
   Se existirem 200 categorias, a estratégia lazy irá fazer
   200 consultas na tabela de categorias;
   Executar um “select c from Categoria c” antes da
   consulta por produtos.


                                           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
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 permanecem abertos 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: 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
Estratégias de Web UI
 Dica: Integrar View Helper com o serviço de
 persistência;
   Implementação de List 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).

   Vídeo demo: 001
                                        Globalcode – Open4education
Alberto Lemos (Dr. Spock)
spock@globalcode.com.br
http://twitter.com/drspockbr

Danival Taffarel Calegari
danival@globalcode.com.br



                               Globalcode – Open4education

Dicas e Truques sobre Performance em Java EE, JPA e JSF

  • 1.
    Dicas e Truquessobre performance em Java EE, JPA e JSF Alberto Lemos (Dr. Spock) Danival Taffarel Calegari Instrutor Globalcode Instrutor Globalcode Senior Software Architect Senior Software Architect Globalcode – Open4education
  • 2.
    Agenda Motivação Estratégiasde 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 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égiasde 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 Lazy: só recupera um dado quando necessário. Eager: recupera o dado sempre. Globalcode – Open4education
  • 7.
    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
  • 8.
    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 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
  • 9.
    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
  • 10.
    Cache Cache deprimeiro nível Enquanto o EntityManager estiver aberto, ele armazena os objetos carregados por ele; Este cache é apagado quando o método clear é chamado. Cache de segundo nível Armazena os objetos por EntityManagerFactory; Cache “por aplicação”. Globalcode – Open4education
  • 11.
    Cache EntityManagerFactory Cache nível 2 EntityManager EntityManager EntityManager Cache nível 1 Cache nível 1 Cache nível 1 Globalcode – Open4education
  • 12.
    Cache Truque: Façauma 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 com preço menor que x. Se existirem 200 categorias, a estratégia lazy irá fazer 200 consultas na tabela de categorias; Executar um “select c from Categoria c” antes da consulta por produtos. Globalcode – Open4education
  • 13.
    Cache Dica: Usecache 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
  • 14.
    Agenda Motivação Estratégiasde 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
  • 15.
    Estratégias de WebUI 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
  • 16.
    Estratégias de WebUI Dica: Manter o contexto de persistência no escopo view ou conversation; EntityManager permanecem abertos por um tempo controlado; Globalcode – Open4education
  • 17.
    Estratégias de WebUI 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
  • 18.
    Estratégias de WebUI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  • 19.
    Estratégias de WebUI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  • 20.
    Estratégias de WebUI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  • 21.
    Estratégias de WebUI Dica: Integrar View Helper com o serviço de persistência; Implementação de List 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). Vídeo demo: 001 Globalcode – Open4education
  • 22.
    Alberto Lemos (Dr.Spock) spock@globalcode.com.br http://twitter.com/drspockbr Danival Taffarel Calegari danival@globalcode.com.br Globalcode – Open4education