Melhorar desempenho JPA

Abaixo temos algumas recomendações para melhorar o desempenho de aplicações com JPA e Hibernate

  • Utilizar a annotation @BatchSize(size=TAMANHO) para melhorar o desempenho em entidades que recuperam vários registros.
  • Utilizar join fetch ao invés de relacionamentos EAGER para coleções. Dessa forma evitará LazyInitializationException e carregar vários dados em memória com o EAGER.
  • Utilizar EAGER em anotações @ManyToMany e @OneToMany somente em coleções que temos certeza que são pequenas, por exemplo com uns 5 registros no máximo.
  • Caso queira evitar  consultas utilizando o join fetch, utilizar o utilitário Hibernate.initialize(objeto) para carregar a coleção LAZY quando necessário para não obter LazyInitializationException
  • Evitar utilizar o Collections.sort e utilizar o order by do jpa.
  • Evitar utilizar o ID nos métodos equals e hashCode, mais informações nesse link.
  • Utilizar Named Queries para facilitar o gerenciamento.
  • Utilizar setFirstResult, setMaxResults da classe Query em locais onde é desejado paginação ou retornam muitos resultados.
  • Habilitar o cache de consultas no persistence.xml (em produção): <property name="hibernate.cache.use_query_cache">true</property>
  • Desabilitar logs desnecessários no persistence.xml (em produção): <property name="hibernate.show_sql" value="false" /> e <property name="hibernate.format_sql" value="false" />

Exemplos de mapeamentos incorretos e lentos:

@ManyToMany(fetch = FetchType.EAGER)
private Set algo;

Onde algo são vários registros que não são utilizados nas telas da aplicação. Outras possíveis formas de se melhorar o desempenho é utilizar cache secundário e habilitar cache de queries. Se você tiver alguma outra dica é só avisar.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6