Temos um cadastro de Pessoas que possui no banco cerca de 20.000 registros.
Devido aos relacionamentos ManyToOne, consulta no banco tá demorando demais, e quando é feita pela segunda vez dá OutofMemory.
qual eh a razao pela qual vc esta fazendo uma query que retorna 20k registros? vc nao pode paginar isso?
kaique
Verifica se a situação realmente necessita que a consulta seja através da camada com JPA. Por exemplo, se for uma consulta para somente popular um relatório, não existe necessidade de você criar uma cadeia de objetos na memória somente para popular o tal relatório. Você pode seguir a sugestão do amigo acima e utilizar somente JDBC, que deve ter uma melhor performance no quesito consumo de memória. Sacou?
[]'s.
tvarjao
Estou usando o ZKFramework, e essa lista popula um listbox que ja tem uma paginação padrão, que é usado em todo o nosso projeto.
quanto ao JDBC, vai me fazer as vantagens do mapeamento!
fantomas
Oi tvarjao!
Pelo código que você apresentou fica difícil de saber o seu problema.
Por que:
Você está utilizando LAZY, ou seja, no primeiro acesso NÃO será lido a cidade e a profissão; logo, não deveria ser tão lento assim.
O seu código diz que o SQL gerado pela JPA será uma código simples; serão apenas joins (desconsiderando o LAZY) sem muita complicação, ou seja, mesmo com JDBC deveria ficar lento.
Dito isto, considere o seguinte:
Configure o ORM JPA para mostrar as instruções SQLs para você verificar se elas são realmente a causa da baixa performance.
Verifique a quantidade de memória do servidor ONDE ESTÁ O BANCO DE DADOS.
Verifique se as tabelas envolvidas possuem indices adequandos para os joins.
Considere a paginação dos dados (Explique qual componente do ZK vc está utilizando para paginar - se for apenas os componentes visuais não será o suficiente).
…
flws
tvarjao
fantomas:
Oi tvarjao!
Pelo código que você apresentou fica difícil de saber o seu problema.
Por que:
Você está utilizando LAZY, ou seja, no primeiro acesso NÃO será lido a cidade e a profissão; logo, não deveria ser tão lento assim.
O seu código diz que o SQL gerado pela JPA será uma código simples; serão apenas joins (desconsiderando o LAZY) sem muita complicação, ou seja, mesmo com JDBC deveria ficar lento.
Dito isto, considere o seguinte:
Configure o ORM JPA para mostrar as instruções SQLs para você verificar se elas são realmente a causa da baixa performance.
Verifique a quantidade de memória do servidor ONDE ESTÁ O BANCO DE DADOS.
Verifique se as tabelas envolvidas possuem indices adequandos para os joins.
Considere a paginação dos dados (Explique qual componente do ZK vc está utilizando para paginar - se for apenas os componentes visuais não será o suficiente).
…
flws
O componente ZK q uso é o LISTBOX, que tras a opção de paginar como um simples atributo… por isso é muito prático!
minha consulta é feita assim:
TypedQuery<Pessoa> query = em.createQuery("SELECT o FROM Pessoa o", Pessoa.class);
return query.getResultList();
O Hibernate já está exibindo os sqls e mesmo com o LAZY, a aplicação parece estar consultando a tabela de cidades.
Seria possivel configurar a paginação do LISTBOX manualmente? e fazendo com q ele faça uma consulta em cada página?
Vlw!!!
balrog
muito pratico, mas pelo que esta parecendo o componente traz tudo e faz a paginacao no cliente, paginacao em uma tabela com 20k registros tem que ser feita no banco de dados, se o componente nao oferece isso, arregace as mangas e escreva um componente seu
fantomas
Oi!
Pelo que vc escreveu o ZK está fora de questão, ele foi feito apenas para parte visual. Como foi dito, a paginação tem que ser resolvida a parte e associada ao componente visual.
Sendo assim, vamos lá:
Qual banco vc está utilizando?
Se vc utilizou LAZY na anotação, ele (JPA) não deveria ecessar a tabela de cidades; tenha certeza de que isto está realmente acontecendo. Verifique tambem se vc não está acessando a lista de cidade (getCidade()) APÓS a execução da leitura na tabela Pessoa.
Você disse que está lento, mas quanto tempo está levando realmente; 10, 15, 30 segundos?
Para medir o tempo vc tem que marcar uma linha antes do “query.getResultList()” e uma linha depois.
Como você está jogando 20k em um componente visual; a demora em construir/renderizar o componente pode ser grande tambem, verifique isto.
Você realmente precisa de 20k de dados em uma lista? Estas linhas não podem ser filtradas?
…
flws
tvarjao
É isso ai galera, a solução foi mesmo fazer minha própria paginação. Resolvi mesmo e a performance fico perfita.