SlideShare uma empresa Scribd logo
1 de 26
Sobre mim
 Frederico Maia Arantes / @fredmaia
 Programador Java EE na PC Sistemas
 Oracle Certified Java SE 6 Programmer (OCJP 6)
 Instrutor Java na Supera Tecnologia
 JUGLeader do Gojava
 Artigo na Easy Java Magazine (Devmedia)
 http://devsexperts.com
Sobre vocês?
Antes que eu me esqueça...

Fica, vai ter brindes.
O Hibernate
 Framework para mapeamento Objeto Relacional.
 Mapear o banco para as classes.

 Simplifica o desenvolvimento e aumenta
 produtividade. Independência de banco de dados e
 muitas outras vantagens.

 Mas é preciso conhecer bem seus frameworks.
Qual a diferença entre JPA e Hibernate?
 JPA é uma especificação.

 Hibernate é uma implementação.

 Hibernate surgiu primeiro e a JPA foi inspirada em
 frameworks como ele, TopLink, EclipseLink.
 JPA são “regras” de como deve ser feito. O
 Hibernate pode ser usado como implementação
 destas regras ou com suas “próprias regras”.
LOL! Agora posso esquecer do
banco de dados e pensar só nos
objetos!


                         What??? Wait!!
Não esqueça do Banco de Dados
 Pelo contrário, tenha muita atenção para não perder
 performance!
 Em OO pensamos em especializar, dividir
 responsabilidades, classes pequenas e coesas.
 No banco de dados nem sempre é bom dividir, as
 vezes é bom unir e evitar consultas com vários joins
 desnecessários.
 Em banco de dados não existe herança!
Entenda as estratégias herança
 Você deve entender as estratégias de herança do
 JPA e Hibernate:
   @SingleTable

   @Joined

   @TablePerClass

  public class Pessoa extends PessoaJuridica {
E essas aqui, conhece?
 LazyInitializationException

 TransientObjectException

 PersistentObjectException
LazyInitializationException
Session session = sessionFactory.openSession();
NotaFiscal nf = (NotaFiscal) session.load(NotaFiscal.class, 42);
session.close();
List<Item> items = nf.getItems();
System.out.println("numero de pedidos:" + items.size());
org.hibernate.LazyInitializationException

 Porque? Como resolver?

 Sessão fechada ao tentar buscar os itens.

 Eager, manter a sessão aberta ou fetch.

 O ideal? Planeje suas queries, use Lazy nos
   relacionamentos e fetch ao buscar os registros.
TransientObjectException
Autor a = new Autor();
Livro l = new Livro();
a.setLivros(Collections.singleton(l));
manager.persist(a);
org.hibernate.TransientObjectException - object references an unsaved transient
  instance

 Porque? Como resolver?

 Livro não está sendo salvo, apenas o autor.

 Chame o persist(l) na transação ou use Cascade no
  relacionamento entre Autor e Livro.
Ministério do JPA adverte:



Use Cascade com moderação.
PersistentObjectException
Produto p = new Produto();
p.setId(1l);
p.setDescricao(“Computador”);
manager.persist(p);

org.hibernate.PersistentObjectException: detached entity passed to persist

 Porque? Como resolver?

 Seu id está @GeneratedValue e sua entidade
  detached. Deveria estar transiente ou managed.
 Antes de persistir use o find, ou o merge.
Entenda os estados das entidades JPA
 Transient ou New: não possui identidade e não
 está associado a um EntityManager

 Managed: possui identidade, está associado, seu
 conteúdo é sincronizado com o banco de dados

 Detached: possui identidade, mas não está
 associado, portanto não é sincronizado
Cuidado com o Lazy
 Cuidado com OpenSessionInView para resolver
 Lazy exceptions.

 Planeje suas queries.

 Monte-as para obter o resultado de acordo com o
 que precisa em cada cenário.
Cuidado com as n+1 queries
 Uma NotaFiscal com Items lazy, gastamos

 duas queries. Para uma lista de NotaFiscal
 resultante de uma query, para cada
 NotaFiscal teremos uma nova query executada para
 todo getItems invocados. 1 query para
 listar NotaFiscal, N queries para pegar os relacionamentos.
 Use configurações de batch-size e fetch-size para carregar
 as entidades/relacionamentos em blocos em vez de 1 em 1.
Utilize second level cache
 Utilize second level cache para consultas que você
 precisa muito.

 Estes dados não devem ser alterados com
 frequência.

 Reduza suas idas ao banco de dados.
Utilize um pool de conexões
 Mantém um número (que você define) de conexões
 abertas sempre, evita o custo de abrí-las a todo o
 momento e cair no OneSessionPerRequest.

 Se estiver usando o hibernate sem um servidor EE
 uma boa opção é o C3P0.

 Ou utilize um servidor JEE e configue nele mesmo.
Pra que buscar sempre o objeto inteiro?
 Você tem na tela uma combobox de fornecedores e
 precisa de Id e Nome.

 Vai usar um “from Fornecedor” e trazer
 Id, Nome, CNPJ, Razão
 Sozial, CNAE, Endereço, Status, Tipo do
 Fornecedor... ?

 Use: select f.id, f.nome from Fornecedor f
Utilize o Hibernate Statistics
 Saiba quantas vezes cada entidade, coleção
 (relacionamento) e query está sendo
 carregada/executada.
 Quantas vezes o cache foi usado.

 Tempo médio de cada query.

 Com estes dados, saiba onde colocar
 cache, configurar batchsize e fazer joins com fetch
 eager.
Uuuuuii! Ele não usa SQL...




assim pode mudar de banco de dados a
           hora que quiser.
Vai mesmo mudar de banco de dados?
 Poucos sistemas tem que rodar realmente em
 vários BD’s ou têm possibilidade de serem
 alterados.
 Seu sistema se encaixa neste cenário?

 Então não tenho medo de utilizar SQL nativo se
 precisar. Você pode estar perdendo excelentes
 recursos que os bancos de dados oferecem.
Estude a documentação
 Estude a especificação do JPA.

 Estude a documentação do Hibenate.

 Estude o capítulo de performance do hibernate.

 Estude seu banco de dados.

 Estude... sempre.
Obrigado!

Mais conteúdo relacionado

Mais procurados

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
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com HibernateDanilo Braga
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineOtávio Calaça Xavier
 
Doctrine 2 camada de persistência para php
Doctrine 2   camada de persistência para phpDoctrine 2   camada de persistência para php
Doctrine 2 camada de persistência para phpFabio B. Silva
 
Apostila hibernate
Apostila hibernateApostila hibernate
Apostila hibernateAgenor Neto
 
BRMS - Business Rules Management System
BRMS - Business Rules Management SystemBRMS - Business Rules Management System
BRMS - Business Rules Management SystemSamuel Tauil
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
Mapeamento Objeto-Relacional com Java Persistence API
Mapeamento Objeto-Relacional com Java Persistence APIMapeamento Objeto-Relacional com Java Persistence API
Mapeamento Objeto-Relacional com Java Persistence APIbrunoleitealves
 
Java database connectivity jdbc
Java database connectivity   jdbcJava database connectivity   jdbc
Java database connectivity jdbcDinarte Filho
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Dickson S. Guedes
 

Mais procurados (20)

Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
Anotações do mapeamento OR
Anotações do mapeamento ORAnotações do mapeamento OR
Anotações do mapeamento OR
 
Hibernate-consultas
Hibernate-consultasHibernate-consultas
Hibernate-consultas
 
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
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com Hibernate
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP Doctrine
 
Doctrine 2 camada de persistência para php
Doctrine 2   camada de persistência para phpDoctrine 2   camada de persistência para php
Doctrine 2 camada de persistência para php
 
Jpa, hibernate and jpql
Jpa, hibernate and jpqlJpa, hibernate and jpql
Jpa, hibernate and jpql
 
Apostila hibernate
Apostila hibernateApostila hibernate
Apostila hibernate
 
Spring Data Jpa
Spring Data JpaSpring Data Jpa
Spring Data Jpa
 
Como criar Custom Tags
Como criar Custom TagsComo criar Custom Tags
Como criar Custom Tags
 
BRMS - Business Rules Management System
BRMS - Business Rules Management SystemBRMS - Business Rules Management System
BRMS - Business Rules Management System
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Mapeamento Objeto-Relacional com Java Persistence API
Mapeamento Objeto-Relacional com Java Persistence APIMapeamento Objeto-Relacional com Java Persistence API
Mapeamento Objeto-Relacional com Java Persistence API
 
POO - 21 - Java e Banco de Dados
POO - 21 - Java e Banco de DadosPOO - 21 - Java e Banco de Dados
POO - 21 - Java e Banco de Dados
 
Java database connectivity jdbc
Java database connectivity   jdbcJava database connectivity   jdbc
Java database connectivity jdbc
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Java20141219
Java20141219Java20141219
Java20141219
 
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
 
Jj08 otimizacao
Jj08 otimizacaoJj08 otimizacao
Jj08 otimizacao
 

Destaque

2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simplesLukinha92
 
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...Michel Souza
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento ORNécio de Lima Veras
 
Workshop modelando usuários, tarefas e idéias
Workshop modelando usuários, tarefas e idéiasWorkshop modelando usuários, tarefas e idéias
Workshop modelando usuários, tarefas e idéiasKarine Drumond
 
Sistema de gestão de restaurantes self service - ultima versão 3
Sistema de gestão de restaurantes self   service - ultima versão 3Sistema de gestão de restaurantes self   service - ultima versão 3
Sistema de gestão de restaurantes self service - ultima versão 3brunogea
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com HibernateDanilo Braga
 
Restaurante
RestauranteRestaurante
Restaurantemarcuzu
 
Apostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e PrimefacesApostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e PrimefacesRosicleia Frasson
 

Destaque (13)

Hibernate
HibernateHibernate
Hibernate
 
Apresentação mapeamento objeto relacional
Apresentação mapeamento objeto relacionalApresentação mapeamento objeto relacional
Apresentação mapeamento objeto relacional
 
2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples
 
Hibernate
HibernateHibernate
Hibernate
 
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
 
Workshop modelando usuários, tarefas e idéias
Workshop modelando usuários, tarefas e idéiasWorkshop modelando usuários, tarefas e idéias
Workshop modelando usuários, tarefas e idéias
 
Aula JPA
Aula JPAAula JPA
Aula JPA
 
Sistema de gestão de restaurantes self service - ultima versão 3
Sistema de gestão de restaurantes self   service - ultima versão 3Sistema de gestão de restaurantes self   service - ultima versão 3
Sistema de gestão de restaurantes self service - ultima versão 3
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com Hibernate
 
Restaurante
RestauranteRestaurante
Restaurante
 
Apostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e PrimefacesApostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e Primefaces
 
Aula parte 1 de JSF 2.2
Aula parte 1 de JSF 2.2Aula parte 1 de JSF 2.2
Aula parte 1 de JSF 2.2
 

Semelhante a Dicas de Performance com JPA e Hibernate

5 coisas que todo desenvolvedor deveria saber sobre sql server
5 coisas que todo desenvolvedor deveria saber sobre sql server5 coisas que todo desenvolvedor deveria saber sobre sql server
5 coisas que todo desenvolvedor deveria saber sobre sql serverMarcos Freccia
 
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server Marcos Freccia
 
Mini curso hibernate com anotações
Mini curso hibernate com anotaçõesMini curso hibernate com anotações
Mini curso hibernate com anotaçõesdieguinhomcz
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisrafaelberlanda
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotationeduardo dias
 
Workshop Hibernate Com Comentarios
Workshop Hibernate Com ComentariosWorkshop Hibernate Com Comentarios
Workshop Hibernate Com ComentariosMarcelo Mrack
 
Dicas e truques sobre performance em JavaEE, JPA e JSF
Dicas e truques sobre performance em JavaEE, JPA e JSFDicas e truques sobre performance em JavaEE, JPA e JSF
Dicas e truques sobre performance em JavaEE, JPA e JSFDr. Spock
 
Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Rafael Ponte
 
Dicas e Truques sobre Performance em Java EE, JPA e JSF
Dicas e Truques sobre Performance em Java EE, JPA e JSFDicas e Truques sobre Performance em Java EE, JPA e JSF
Dicas e Truques sobre Performance em Java EE, JPA e JSFDr. Spock
 
Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7David Willian
 
Busca de Documentos (Marilia TechDay 2011)
Busca de Documentos (Marilia TechDay 2011)Busca de Documentos (Marilia TechDay 2011)
Busca de Documentos (Marilia TechDay 2011)Fabrício Catae
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 

Semelhante a Dicas de Performance com JPA e Hibernate (20)

5 coisas que todo desenvolvedor deveria saber sobre sql server
5 coisas que todo desenvolvedor deveria saber sobre sql server5 coisas que todo desenvolvedor deveria saber sobre sql server
5 coisas que todo desenvolvedor deveria saber sobre sql server
 
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
Webcast: 5 coisas que todo desenvolvedor deveria saber sobre sql server
 
Mini curso hibernate com anotações
Mini curso hibernate com anotaçõesMini curso hibernate com anotações
Mini curso hibernate com anotações
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portais
 
Siga a doutrina certa
Siga a doutrina certaSiga a doutrina certa
Siga a doutrina certa
 
Hibernate
HibernateHibernate
Hibernate
 
Hibernate - Aula 01
Hibernate - Aula 01Hibernate - Aula 01
Hibernate - Aula 01
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotation
 
Course Hibernate 2008
Course Hibernate 2008Course Hibernate 2008
Course Hibernate 2008
 
Workshop Hibernate Com Comentarios
Workshop Hibernate Com ComentariosWorkshop Hibernate Com Comentarios
Workshop Hibernate Com Comentarios
 
Dicas e truques sobre performance em JavaEE, JPA e JSF
Dicas e truques sobre performance em JavaEE, JPA e JSFDicas e truques sobre performance em JavaEE, JPA e JSF
Dicas e truques sobre performance em JavaEE, JPA e JSF
 
Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)
 
Dicas e Truques sobre Performance em Java EE, JPA e JSF
Dicas e Truques sobre Performance em Java EE, JPA e JSFDicas e Truques sobre Performance em Java EE, JPA e JSF
Dicas e Truques sobre Performance em Java EE, JPA e JSF
 
Conhecendo o Spring
Conhecendo o SpringConhecendo o Spring
Conhecendo o Spring
 
Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7Java Primeiros Passos - Cap 7
Java Primeiros Passos - Cap 7
 
Busca de Documentos (Marilia TechDay 2011)
Busca de Documentos (Marilia TechDay 2011)Busca de Documentos (Marilia TechDay 2011)
Busca de Documentos (Marilia TechDay 2011)
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Persistência JPA
Persistência JPAPersistência JPA
Persistência JPA
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
Arquitetura SINFO 1.1
Arquitetura SINFO 1.1Arquitetura SINFO 1.1
Arquitetura SINFO 1.1
 

Mais de Frederico Maia Arantes

The best way to create and deploy web apps with full-stack type safety - Mete...
The best way to create and deploy web apps with full-stack type safety - Mete...The best way to create and deploy web apps with full-stack type safety - Mete...
The best way to create and deploy web apps with full-stack type safety - Mete...Frederico Maia Arantes
 
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...Frederico Maia Arantes
 
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Frederico Maia Arantes
 
Apresentando meteor! Join Community - Goiânia
Apresentando meteor! Join Community - GoiâniaApresentando meteor! Join Community - Goiânia
Apresentando meteor! Join Community - GoiâniaFrederico Maia Arantes
 
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto AlegreJava 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto AlegreFrederico Maia Arantes
 
Meteor - Nunca foi tão fácil desenvolver pra web e mobile
Meteor - Nunca foi tão fácil desenvolver pra web e mobileMeteor - Nunca foi tão fácil desenvolver pra web e mobile
Meteor - Nunca foi tão fácil desenvolver pra web e mobileFrederico Maia Arantes
 
Cloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App EngineCloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App EngineFrederico Maia Arantes
 
Visão Geral do Java para Iniciantes - FLISOL 2011
Visão Geral do Java para Iniciantes - FLISOL 2011Visão Geral do Java para Iniciantes - FLISOL 2011
Visão Geral do Java para Iniciantes - FLISOL 2011Frederico Maia Arantes
 
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaJSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaFrederico Maia Arantes
 

Mais de Frederico Maia Arantes (12)

The best way to create and deploy web apps with full-stack type safety - Mete...
The best way to create and deploy web apps with full-stack type safety - Mete...The best way to create and deploy web apps with full-stack type safety - Mete...
The best way to create and deploy web apps with full-stack type safety - Mete...
 
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
Produtividade e deploy na criação de apps NodeJS com MeteorJS - Join Communit...
 
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
Java 8 - Afinal onde usamos no dia a dia? GOJava 15 anos!
 
Apresentando meteor! Join Community - Goiânia
Apresentando meteor! Join Community - GoiâniaApresentando meteor! Join Community - Goiânia
Apresentando meteor! Join Community - Goiânia
 
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto AlegreJava 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
 
Meteor - Nunca foi tão fácil desenvolver pra web e mobile
Meteor - Nunca foi tão fácil desenvolver pra web e mobileMeteor - Nunca foi tão fácil desenvolver pra web e mobile
Meteor - Nunca foi tão fácil desenvolver pra web e mobile
 
Java Web Fácil com VRaptor
Java Web Fácil com VRaptorJava Web Fácil com VRaptor
Java Web Fácil com VRaptor
 
Java no Google App Engine - TDC2011
Java no Google App Engine - TDC2011Java no Google App Engine - TDC2011
Java no Google App Engine - TDC2011
 
Cloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App EngineCloud Computing - Java no Google App Engine
Cloud Computing - Java no Google App Engine
 
Visão Geral do Java para Iniciantes - FLISOL 2011
Visão Geral do Java para Iniciantes - FLISOL 2011Visão Geral do Java para Iniciantes - FLISOL 2011
Visão Geral do Java para Iniciantes - FLISOL 2011
 
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do GojavaJSF 2 e Primefaces - 4º Encontro Mensal do Gojava
JSF 2 e Primefaces - 4º Encontro Mensal do Gojava
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 

Dicas de Performance com JPA e Hibernate

  • 1.
  • 2. Sobre mim Frederico Maia Arantes / @fredmaia  Programador Java EE na PC Sistemas  Oracle Certified Java SE 6 Programmer (OCJP 6)  Instrutor Java na Supera Tecnologia  JUGLeader do Gojava  Artigo na Easy Java Magazine (Devmedia)  http://devsexperts.com
  • 4. Antes que eu me esqueça... Fica, vai ter brindes.
  • 5. O Hibernate  Framework para mapeamento Objeto Relacional. Mapear o banco para as classes.  Simplifica o desenvolvimento e aumenta produtividade. Independência de banco de dados e muitas outras vantagens.  Mas é preciso conhecer bem seus frameworks.
  • 6. Qual a diferença entre JPA e Hibernate?  JPA é uma especificação.  Hibernate é uma implementação.  Hibernate surgiu primeiro e a JPA foi inspirada em frameworks como ele, TopLink, EclipseLink.  JPA são “regras” de como deve ser feito. O Hibernate pode ser usado como implementação destas regras ou com suas “próprias regras”.
  • 7. LOL! Agora posso esquecer do banco de dados e pensar só nos objetos! What??? Wait!!
  • 8. Não esqueça do Banco de Dados  Pelo contrário, tenha muita atenção para não perder performance!  Em OO pensamos em especializar, dividir responsabilidades, classes pequenas e coesas.  No banco de dados nem sempre é bom dividir, as vezes é bom unir e evitar consultas com vários joins desnecessários.  Em banco de dados não existe herança!
  • 9. Entenda as estratégias herança  Você deve entender as estratégias de herança do JPA e Hibernate:  @SingleTable  @Joined  @TablePerClass public class Pessoa extends PessoaJuridica {
  • 10. E essas aqui, conhece?  LazyInitializationException  TransientObjectException  PersistentObjectException
  • 11.
  • 12. LazyInitializationException Session session = sessionFactory.openSession(); NotaFiscal nf = (NotaFiscal) session.load(NotaFiscal.class, 42); session.close(); List<Item> items = nf.getItems(); System.out.println("numero de pedidos:" + items.size()); org.hibernate.LazyInitializationException  Porque? Como resolver?  Sessão fechada ao tentar buscar os itens.  Eager, manter a sessão aberta ou fetch.  O ideal? Planeje suas queries, use Lazy nos relacionamentos e fetch ao buscar os registros.
  • 13. TransientObjectException Autor a = new Autor(); Livro l = new Livro(); a.setLivros(Collections.singleton(l)); manager.persist(a); org.hibernate.TransientObjectException - object references an unsaved transient instance  Porque? Como resolver?  Livro não está sendo salvo, apenas o autor.  Chame o persist(l) na transação ou use Cascade no relacionamento entre Autor e Livro.
  • 14. Ministério do JPA adverte: Use Cascade com moderação.
  • 15. PersistentObjectException Produto p = new Produto(); p.setId(1l); p.setDescricao(“Computador”); manager.persist(p); org.hibernate.PersistentObjectException: detached entity passed to persist  Porque? Como resolver?  Seu id está @GeneratedValue e sua entidade detached. Deveria estar transiente ou managed.  Antes de persistir use o find, ou o merge.
  • 16. Entenda os estados das entidades JPA  Transient ou New: não possui identidade e não está associado a um EntityManager  Managed: possui identidade, está associado, seu conteúdo é sincronizado com o banco de dados  Detached: possui identidade, mas não está associado, portanto não é sincronizado
  • 17. Cuidado com o Lazy  Cuidado com OpenSessionInView para resolver Lazy exceptions.  Planeje suas queries.  Monte-as para obter o resultado de acordo com o que precisa em cada cenário.
  • 18. Cuidado com as n+1 queries  Uma NotaFiscal com Items lazy, gastamos duas queries. Para uma lista de NotaFiscal resultante de uma query, para cada NotaFiscal teremos uma nova query executada para todo getItems invocados. 1 query para listar NotaFiscal, N queries para pegar os relacionamentos.  Use configurações de batch-size e fetch-size para carregar as entidades/relacionamentos em blocos em vez de 1 em 1.
  • 19. Utilize second level cache  Utilize second level cache para consultas que você precisa muito.  Estes dados não devem ser alterados com frequência.  Reduza suas idas ao banco de dados.
  • 20. Utilize um pool de conexões  Mantém um número (que você define) de conexões abertas sempre, evita o custo de abrí-las a todo o momento e cair no OneSessionPerRequest.  Se estiver usando o hibernate sem um servidor EE uma boa opção é o C3P0.  Ou utilize um servidor JEE e configue nele mesmo.
  • 21. Pra que buscar sempre o objeto inteiro?  Você tem na tela uma combobox de fornecedores e precisa de Id e Nome.  Vai usar um “from Fornecedor” e trazer Id, Nome, CNPJ, Razão Sozial, CNAE, Endereço, Status, Tipo do Fornecedor... ?  Use: select f.id, f.nome from Fornecedor f
  • 22. Utilize o Hibernate Statistics  Saiba quantas vezes cada entidade, coleção (relacionamento) e query está sendo carregada/executada.  Quantas vezes o cache foi usado.  Tempo médio de cada query.  Com estes dados, saiba onde colocar cache, configurar batchsize e fazer joins com fetch eager.
  • 23. Uuuuuii! Ele não usa SQL... assim pode mudar de banco de dados a hora que quiser.
  • 24. Vai mesmo mudar de banco de dados?  Poucos sistemas tem que rodar realmente em vários BD’s ou têm possibilidade de serem alterados.  Seu sistema se encaixa neste cenário? Então não tenho medo de utilizar SQL nativo se precisar. Você pode estar perdendo excelentes recursos que os bancos de dados oferecem.
  • 25. Estude a documentação  Estude a especificação do JPA.  Estude a documentação do Hibenate.  Estude o capítulo de performance do hibernate.  Estude seu banco de dados.  Estude... sempre.

Notas do Editor

  1. Quem aqui já conhece o GAE? Já desenvolveram algo?