[Resolvido] Primefaces 3.4.1 - dataTable com paginação muito lenta

Boa noite a todos.

Estou utilizando esta versão de primefaces e estou com um problema no dataTable. Na mudança de página do resultado, ele demora muito a atualizar o dataTable, como se fosse feita a consulta novamente.

Aguem já passou por isso?

Minha base de dados é grande (banco de cep dos correios). Poderia ser esse o motivo?

Agradeço a colaboração de todos.

Você está fazendo a consulta paginada? Ou simplesmente executa a consulta uma vez e joga a lista no datatable?

Se você estiver utilizando a propriedade Lazy com o valor true no seu datatable sempre que você alterar a página ele faz uma nova requisição ao servidor e vai ao banco de dados buscar as informações. Caso esta propriedade tenha o valor false, todas informações já são carregadas e a lentidão é apenas no lado cliente pois tudo é feito por javascript.

Olá Herbert, bom dia.

Executo a consulta uma única vez preenchendo a lista no dataTable.

[quote=grinche]Se você estiver utilizando a propriedade Lazy com o valor true no seu datatable sempre que você alterar a página ele faz uma nova requisição ao servidor e vai ao banco de dados buscar as informações. Caso esta propriedade tenha o valor false, todas informações já são carregadas e a lentidão é apenas no lado cliente pois tudo é feito por javascript.[/quote]Sério? Eu achava que isso dependia da configuração de estado que se encontra no web.xml. Até onde eu sei, se o estado estiver servidor os dados ficam alocados no httpSession; caso o estado esteja cliente, aí sim ficaria salvo lá.

Vou pesquisar melhor sobre isso viu.

Olá Herbert, bom dia.

Executo a consulta uma única vez preenchendo a lista no dataTable.[/quote]E quantos registros estão voltando?

Obrigado pela resposta.

Não estou instanciando a propriedade Lazy. Mas com certeza, ele refaz a pesquisa a cada mudança de pagina, independente da quantidade de resultados retornados. Pode ser 10 resultados ou 100, o tempo é o mesmo.

Obrigado pela resposta.

Não estou instanciando a propriedade Lazy. Mas com certeza, ele refaz a pesquisa a cada mudança de pagina, independente da quantidade de resultados retornados. Pode ser 10 resultados ou 100, o tempo é o mesmo.

[/quote]Mas para saber isso, você não pode ir pelo tempo. Você tem que debugar, ou colocar mensagens para exibir no console.

Olá Herbert, bom dia.

Executo a consulta uma única vez preenchendo a lista no dataTable.[/quote]E quantos registros estão voltando?[/quote]

Herbert, se voltar registros que dêem mais de 1 página, o tempo é o mesmo. Ou seja, se eu clicar na página 2/2 ele demora o mesmo tempo de se eu clicar na página 2/100.

Vou dar uma olhada novamente no web.xml pra ver o estado.

A tarde respondo, pq não estou com o projeto aqui.

Obrigado pela ajuda.

Olá Herbert, bom dia.

Executo a consulta uma única vez preenchendo a lista no dataTable.[/quote]E quantos registros estão voltando?[/quote]

Herbert, se voltar registros que dêem mais de 1 página, o tempo é o mesmo. Ou seja, se eu clicar na página 2/2 ele demora o mesmo tempo de se eu clicar na página 2/100.

Vou dar uma olhada novamente no web.xml pra ver o estado.

A tarde respondo, pq não estou com o projeto aqui.

Obrigado pela ajuda.[/quote]Novamente, tempo não é parâmetro para se deduzir isso…

Obrigado pela resposta.

Não estou instanciando a propriedade Lazy. Mas com certeza, ele refaz a pesquisa a cada mudança de pagina, independente da quantidade de resultados retornados. Pode ser 10 resultados ou 100, o tempo é o mesmo.

[/quote]Mas para saber isso, você não pode ir pelo tempo. Você tem que debugar, ou colocar mensagens para exibir no console.[/quote]

Blz.

Um comportamento que eu achei estranho, já que sempre coloco os benditos System.out.println pra saber o que anda acontecendo, é que, quando a consulta é realizada e por exemplo, no início do método que preenche o dataTable eu coloco um System.out.println para ele me imprimir no console o nome do campo preenchido na página, no console ele me exibe a resposta do System.out.println várias vezes, e não uma só, por exemplo:

public List<Endereco> getCEP() { String campo = this.campoBusca; System.out.println ("campo: " + campo); ...

No console, aparece:

campo: 123456 campo: 123456 campo: 123456 campo: 123456 campo: 123456 campo: 123456 campo: 123456 campo: 123456.

Cara, o get é chamado diversas vezes e não uma só.

Por isso que ta lento. Toda hora você ta disparando a consulta.

Faça algo do tipo:if(resultado == null){ resultado = consultar(); } return resultado;

Depois dê uma olhada nos padrões desse post: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

Ele vai te ajudar.

[quote=Hebert Coelho]Cara, o get é chamado diversas vezes e não uma só.

Por isso que ta lento. Toda hora você ta disparando a consulta.

Faça algo do tipo:if(resultado == null){ resultado = consultar(); } return resultado;[/quote]

Sei que a pergunta pode parecer ignorante, mas me intrigou:
Só pelo fato de eu colocar o nome do método iniciando com get ele chama diversas vezes?

Eu faço uma verificação de conteudo nulo sim dentro de um if e ele só executa a consulta se o conteúdo não for null ou não for empty.

[quote=Kleber-rr][quote=Hebert Coelho]Cara, o get é chamado diversas vezes e não uma só.

Por isso que ta lento. Toda hora você ta disparando a consulta.

Faça algo do tipo:if(resultado == null){ resultado = consultar(); } return resultado;[/quote]

Sei que a pergunta pode parecer ignorante, mas me intrigou:
Só pelo fato de eu colocar o nome do método iniciando com get ele chama diversas vezes?

Eu faço uma verificação de conteudo nulo sim dentro de um if e ele só executa a consulta se o conteúdo não for null ou não for empty.[/quote]Não.
O método ele é chamado por que na tela (xhtml/jsp) tem algum componente apontando para o método. O JSF precisa fazer várias verificações/utilizações e o primefaces também.

Nunca popule um objeto dentro do método get, pois a cada requisição feita ao seu ManagedBean ele vai entrar no método get.
Crie uma propriedade no seu ManagedBean e também um método que vai popular este objeto, anote este método como PostConstruct, e então popule este e outros objetos neste método “inicial”.
http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html

Ou no seu xhtml utilize este evento para chamar um método que popula esta sua propriedade do managedBean.

<f:event listener="#{managedBean.metodo}" type="preRenderView" />

[]'s

[quote=Hebert Coelho][quote=Kleber-rr][quote=Hebert Coelho]Cara, o get é chamado diversas vezes e não uma só.

Por isso que ta lento. Toda hora você ta disparando a consulta.

Faça algo do tipo:if(resultado == null){ resultado = consultar(); } return resultado;[/quote]

Sei que a pergunta pode parecer ignorante, mas me intrigou:
Só pelo fato de eu colocar o nome do método iniciando com get ele chama diversas vezes?

Eu faço uma verificação de conteudo nulo sim dentro de um if e ele só executa a consulta se o conteúdo não for null ou não for empty.[/quote]Não.
O método ele é chamado por que na tela (xhtml/jsp) tem algum componente apontando para o método. O JSF precisa fazer várias verificações/utilizações e o primefaces também.[/quote]

Mas na xhtml o método esta instanciado em um commandButton, então entendo que ele só é executado quando acionado. Estou correto?

Não! Todo método que inicia com o nome get vai ser chamado a cada requisição.

[quote=grinche]Não! Todo método que inicia com o nome get vai ser chamado a cada requisição.
[/quote]

Bom, vou testar então mudando o nome do método pra ver se ele é acionado + de 1 vez na requisição.

São os ciclos de vida do jsf, ele vai acessas seus métodos get várias vezes.
De uma olhada neste link abaixo, que você vai entender melhor.

http://gustavopinto.wordpress.com/tag/jsf/