SlideShare ist ein Scribd-Unternehmen logo
1 von 22
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

Weitere ähnliche Inhalte

Ähnlich wie Dicas JSF, JPA e Desempenho

Polis Hyperlink Dicas e truques de Performance para JPA e EJB
Polis Hyperlink Dicas e truques de Performance para JPA e EJBPolis Hyperlink Dicas e truques de Performance para JPA e EJB
Polis Hyperlink Dicas e truques de Performance para JPA e EJBDanival Calegari
 
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrões
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrõesMC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrões
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrõesRodrigo Cândido da Silva
 
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaTDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaCleber Dantas
 
TDC2016SP - Python x R: mas e o Weka?
TDC2016SP - Python x R: mas e o Weka?TDC2016SP - Python x R: mas e o Weka?
TDC2016SP - Python x R: mas e o Weka?tdc-globalcode
 
Python x R: mas e o Weka?
Python x R: mas e o Weka? Python x R: mas e o Weka?
Python x R: mas e o Weka? pichiliani
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaAlexandre Tarifa
 
WordCamp SP 2019 - PeachPie unindo Php com C# .Net Core
WordCamp SP 2019 - PeachPie unindo Php com C# .Net CoreWordCamp SP 2019 - PeachPie unindo Php com C# .Net Core
WordCamp SP 2019 - PeachPie unindo Php com C# .Net CoreVanessa Valle
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) Grupo Treinar
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Organizando a casa. o front end do jeitinho que a mamãe gosta
Organizando a casa. o front end do jeitinho que a mamãe gostaOrganizando a casa. o front end do jeitinho que a mamãe gosta
Organizando a casa. o front end do jeitinho que a mamãe gostaJohnathan Cardoso
 
Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a Rômulo Jales
 
Projetos Java com Maven
Projetos Java com MavenProjetos Java com Maven
Projetos Java com MavenEdgar Dantas
 
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Edlaine Zamora
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
Arteccom Workshop Magento
Arteccom Workshop MagentoArteccom Workshop Magento
Arteccom Workshop MagentoThiago Verly
 
Elastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreElastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreRafael Gomes
 
Arquiteturas Java EE no Google App Engine
Arquiteturas Java EE no Google App EngineArquiteturas Java EE no Google App Engine
Arquiteturas Java EE no Google App EngineEder Magalhães
 

Ähnlich wie Dicas JSF, JPA e Desempenho (20)

Polis Hyperlink Dicas e truques de Performance para JPA e EJB
Polis Hyperlink Dicas e truques de Performance para JPA e EJBPolis Hyperlink Dicas e truques de Performance para JPA e EJB
Polis Hyperlink Dicas e truques de Performance para JPA e EJB
 
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrões
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrõesMC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrões
MC31 - Desenvolvimento um Aplicativo completo usando JSF, EJB e padrões
 
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaTDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
 
TDC2016SP - Python x R: mas e o Weka?
TDC2016SP - Python x R: mas e o Weka?TDC2016SP - Python x R: mas e o Weka?
TDC2016SP - Python x R: mas e o Weka?
 
Python x R: mas e o Weka?
Python x R: mas e o Weka? Python x R: mas e o Weka?
Python x R: mas e o Weka?
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
WordCamp SP 2019 - PeachPie unindo Php com C# .Net Core
WordCamp SP 2019 - PeachPie unindo Php com C# .Net CoreWordCamp SP 2019 - PeachPie unindo Php com C# .Net Core
WordCamp SP 2019 - PeachPie unindo Php com C# .Net Core
 
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO) CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
CURSO DELPHI FUND. CLIENT SERVER (DIURNO)
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Organizando a casa. o front end do jeitinho que a mamãe gosta
Organizando a casa. o front end do jeitinho que a mamãe gostaOrganizando a casa. o front end do jeitinho que a mamãe gosta
Organizando a casa. o front end do jeitinho que a mamãe gosta
 
Mini curso JBC
Mini curso JBCMini curso JBC
Mini curso JBC
 
Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a
 
Projetos Java com Maven
Projetos Java com MavenProjetos Java com Maven
Projetos Java com Maven
 
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Arteccom Workshop Magento
Arteccom Workshop MagentoArteccom Workshop Magento
Arteccom Workshop Magento
 
Elastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreElastic MeetUp Porto Alegre
Elastic MeetUp Porto Alegre
 
Arquiteturas Java EE no Google App Engine
Arquiteturas Java EE no Google App EngineArquiteturas Java EE no Google App Engine
Arquiteturas Java EE no Google App Engine
 

Mehr von Dr. Spock

Improving Batch-Process Testing Techniques with a Domain-Specific Language
Improving Batch-Process Testing Techniques with a Domain-Specific LanguageImproving Batch-Process Testing Techniques with a Domain-Specific Language
Improving Batch-Process Testing Techniques with a Domain-Specific LanguageDr. Spock
 
Avoiding Java EE Application Design Traps to Achieve Effective Use of Cloud C...
Avoiding Java EE Application Design Traps to Achieve Effective Use of Cloud C...Avoiding Java EE Application Design Traps to Achieve Effective Use of Cloud C...
Avoiding Java EE Application Design Traps to Achieve Effective Use of Cloud C...Dr. Spock
 
Evitando Armadilhas no Projeto de Aplicações Java EE para uso eficaz na nuvem
Evitando Armadilhas no Projeto de Aplicações Java EE para uso eficaz na nuvemEvitando Armadilhas no Projeto de Aplicações Java EE para uso eficaz na nuvem
Evitando Armadilhas no Projeto de Aplicações Java EE para uso eficaz na nuvemDr. Spock
 
Novidades do JSF: Um tour completo no JSF 2.2
Novidades do JSF: Um tour completo no JSF 2.2Novidades do JSF: Um tour completo no JSF 2.2
Novidades do JSF: Um tour completo no JSF 2.2Dr. Spock
 
Workshop de Introdução ao ScrumToys
Workshop de Introdução ao ScrumToysWorkshop de Introdução ao ScrumToys
Workshop de Introdução ao ScrumToysDr. Spock
 
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6Dr. Spock
 
TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6
TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6
TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6Dr. Spock
 
TDC2011: Spring Mobile
TDC2011: Spring MobileTDC2011: Spring Mobile
TDC2011: Spring MobileDr. Spock
 
TDC2011: Spring, uma plataforma enterprise, social, móvel e nas nuvens
TDC2011: Spring, uma plataforma enterprise, social, móvel e nas nuvensTDC2011: Spring, uma plataforma enterprise, social, móvel e nas nuvens
TDC2011: Spring, uma plataforma enterprise, social, móvel e nas nuvensDr. Spock
 
TDC2011: Arquitetura de Software Enterprise
TDC2011: Arquitetura de Software EnterpriseTDC2011: Arquitetura de Software Enterprise
TDC2011: Arquitetura de Software EnterpriseDr. Spock
 
TDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & AzureTDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & AzureDr. Spock
 
Spring Framework no desenvolvimento móvel
Spring Framework no desenvolvimento móvelSpring Framework no desenvolvimento móvel
Spring Framework no desenvolvimento móvelDr. Spock
 
Desafios no deploy de aplicações Java EE 6 no Microsoft Azure
Desafios no deploy de aplicações Java EE 6 no Microsoft AzureDesafios no deploy de aplicações Java EE 6 no Microsoft Azure
Desafios no deploy de aplicações Java EE 6 no Microsoft AzureDr. Spock
 
Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer Faces
Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer FacesPerformance Tips and Tricks: Java EE, Java Persistence API and JavaServer Faces
Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer FacesDr. Spock
 
Computação Física com Arduino, Program-ME e Java
Computação Física com Arduino, Program-ME e JavaComputação Física com Arduino, Program-ME e Java
Computação Física com Arduino, Program-ME e JavaDr. Spock
 
Spring 3: Uma Plataforma além do Framework
Spring 3: Uma Plataforma além do FrameworkSpring 3: Uma Plataforma além do Framework
Spring 3: Uma Plataforma além do FrameworkDr. Spock
 
Produtividade com Spring Roo no Google App Engine
Produtividade com Spring Roo no Google App EngineProdutividade com Spring Roo no Google App Engine
Produtividade com Spring Roo no Google App EngineDr. Spock
 
Criando uma Aplicação Web com Spring Roo em 5 minutos!
Criando uma Aplicação Web com Spring Roo em 5 minutos!Criando uma Aplicação Web com Spring Roo em 5 minutos!
Criando uma Aplicação Web com Spring Roo em 5 minutos!Dr. Spock
 
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidadesSpring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidadesDr. Spock
 
Computação Física com Arduino/Program-ME e a Plataforma Java
Computação Física com Arduino/Program-ME e a Plataforma JavaComputação Física com Arduino/Program-ME e a Plataforma Java
Computação Física com Arduino/Program-ME e a Plataforma JavaDr. Spock
 

Mehr von Dr. Spock (20)

Improving Batch-Process Testing Techniques with a Domain-Specific Language
Improving Batch-Process Testing Techniques with a Domain-Specific LanguageImproving Batch-Process Testing Techniques with a Domain-Specific Language
Improving Batch-Process Testing Techniques with a Domain-Specific Language
 
Avoiding Java EE Application Design Traps to Achieve Effective Use of Cloud C...
Avoiding Java EE Application Design Traps to Achieve Effective Use of Cloud C...Avoiding Java EE Application Design Traps to Achieve Effective Use of Cloud C...
Avoiding Java EE Application Design Traps to Achieve Effective Use of Cloud C...
 
Evitando Armadilhas no Projeto de Aplicações Java EE para uso eficaz na nuvem
Evitando Armadilhas no Projeto de Aplicações Java EE para uso eficaz na nuvemEvitando Armadilhas no Projeto de Aplicações Java EE para uso eficaz na nuvem
Evitando Armadilhas no Projeto de Aplicações Java EE para uso eficaz na nuvem
 
Novidades do JSF: Um tour completo no JSF 2.2
Novidades do JSF: Um tour completo no JSF 2.2Novidades do JSF: Um tour completo no JSF 2.2
Novidades do JSF: Um tour completo no JSF 2.2
 
Workshop de Introdução ao ScrumToys
Workshop de Introdução ao ScrumToysWorkshop de Introdução ao ScrumToys
Workshop de Introdução ao ScrumToys
 
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
TDC2012: Usando os recursos de extensibilidade da API de CDI do Java EE 6
 
TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6
TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6
TDC2012: Explorando os conceitos básicos da API de CDI do Java EE 6
 
TDC2011: Spring Mobile
TDC2011: Spring MobileTDC2011: Spring Mobile
TDC2011: Spring Mobile
 
TDC2011: Spring, uma plataforma enterprise, social, móvel e nas nuvens
TDC2011: Spring, uma plataforma enterprise, social, móvel e nas nuvensTDC2011: Spring, uma plataforma enterprise, social, móvel e nas nuvens
TDC2011: Spring, uma plataforma enterprise, social, móvel e nas nuvens
 
TDC2011: Arquitetura de Software Enterprise
TDC2011: Arquitetura de Software EnterpriseTDC2011: Arquitetura de Software Enterprise
TDC2011: Arquitetura de Software Enterprise
 
TDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & AzureTDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & Azure
 
Spring Framework no desenvolvimento móvel
Spring Framework no desenvolvimento móvelSpring Framework no desenvolvimento móvel
Spring Framework no desenvolvimento móvel
 
Desafios no deploy de aplicações Java EE 6 no Microsoft Azure
Desafios no deploy de aplicações Java EE 6 no Microsoft AzureDesafios no deploy de aplicações Java EE 6 no Microsoft Azure
Desafios no deploy de aplicações Java EE 6 no Microsoft Azure
 
Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer Faces
Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer FacesPerformance Tips and Tricks: Java EE, Java Persistence API and JavaServer Faces
Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer Faces
 
Computação Física com Arduino, Program-ME e Java
Computação Física com Arduino, Program-ME e JavaComputação Física com Arduino, Program-ME e Java
Computação Física com Arduino, Program-ME e Java
 
Spring 3: Uma Plataforma além do Framework
Spring 3: Uma Plataforma além do FrameworkSpring 3: Uma Plataforma além do Framework
Spring 3: Uma Plataforma além do Framework
 
Produtividade com Spring Roo no Google App Engine
Produtividade com Spring Roo no Google App EngineProdutividade com Spring Roo no Google App Engine
Produtividade com Spring Roo no Google App Engine
 
Criando uma Aplicação Web com Spring Roo em 5 minutos!
Criando uma Aplicação Web com Spring Roo em 5 minutos!Criando uma Aplicação Web com Spring Roo em 5 minutos!
Criando uma Aplicação Web com Spring Roo em 5 minutos!
 
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidadesSpring Framework 3: Um 'brainstorm' de novas funcionalidades
Spring Framework 3: Um 'brainstorm' de novas funcionalidades
 
Computação Física com Arduino/Program-ME e a Plataforma Java
Computação Física com Arduino/Program-ME e a Plataforma JavaComputação Física com Arduino/Program-ME e a Plataforma Java
Computação Física com Arduino/Program-ME e a Plataforma Java
 

Dicas JSF, JPA e Desempenho

  • 1. 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
  • 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 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 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 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
  • 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ç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
  • 13. 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
  • 14. 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
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. Estratégias de Web UI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  • 19. Estratégias de Web UI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  • 20. Estratégias de Web UI Dica: Uso de componentes com suporte a “lazy loading” via Ajax; Globalcode – Open4education
  • 21. 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
  • 22. Alberto Lemos (Dr. Spock) spock@globalcode.com.br http://twitter.com/drspockbr Danival Taffarel Calegari danival@globalcode.com.br Globalcode – Open4education