eu tenho um Banco de dados Postgres com 17 tabelas criadas pelo Hibernate com o @Entidade anotação e iam correndo CrudRepository com o encontrar tudo método para extrair objetos do banco de dados
Tudo funciona bem até eu tentar recuperar mais de 1000 objetos do banco de dados, o que leva 27 segundos. A recuperação de 600 objetos leva cerca de 10 segundos.
O tempo está aumentando exponencialmente e eu estouimaginando se existe uma solução para isso, sei que se eu tentar ingressar em tabelas, isso aceleraria o processo, mas ingressar em 17 tabelas é muito trabalhoso. Existem outros métodos de extração mais rápidos na recuperação de objetos além do que estou usando?
É assim que eu recupero objetos:
public List<Document> getAllDatabaseDocuments() {
List<Document> listOfDocs = new ArrayList<>();
listOfDocs.addAll((List<Document>) sdr.findAll());
return listOfDocs;
}
Respostas:
0 para resposta № 1Todos os provedores de JPA têm QueryHints
para fazer certa otimização de consulta. Ele fornece a capacidade de buscar todas as associações em uma única consulta ou usando junções. Por exemplo, no EclipseLink, você pode usar QueryHints.BATCH
buscar tudo one to many
ou many to many
associações em uma única consulta.
Ao invés de usar findAll()
, crie sua própria consulta em sua entidade e forneça a dica de consulta apropriada específica para hibernar. join-fetch
no seu caso, levará muito tempo porque você possui muitas entidades relacionadas. Tente usar batch-fetch
pois reduzirá o número de consultas e acelera efetivamente a busca.
Você pode aprender mais sobre estratégias de busca específicas da hibernação Aqui