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.
Muito bom Thiago o post, muito problemas de performance podem ser resolvidos com esses detalhes, com um cache ai fica mais rápido ainda desenvolver com jpa.
Legal Thiago! Boas dicas.
Opa blz?
Cara estou começando a trabalhar em um projeto em que usa Jpa, Hibernate e Spring, nesse projeto as consultas estão demoradas, estou querendo usar Cache do Hibernate, você me indica algum material bom, lembrando que é o Spring que gerencia as dependências.
Obrigado
Cara.. será que não é porque você está utilizando muito EAGER e trazendo mais dados que o necessário?