Olá Pessoal,
Estou com problema de performance em minha aplicação, quando utilizo tabelas com mais de 30.000 registros. Esta levando +/- 2 minutos para carregar o o datatable. Estou utilizando JSf 2 com mysql. Até 15.000 registro a performance é muito boa. Alguma dica ? Abaixo minha query e o .ini do meu mysql (estou avaliando para alterar para aumentar o consumo de memoria).
public List<Participante> getAllParticipantes(int idEmpresa) {
return getList(Participante.class,"select particip "
+ "from Participante particip, Empresa emp "
+ "where particip.empresa = emp and emp.id = ?1 and "
+ "(particip.deletado != 'S' or particip.deletado is null) ", idEmpresa);
}
[client]
port=3306
[mysql]
default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files (x86)/MySQL/MySQL Server 5.1/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/"
character-set-server=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=0
table_cache=256
tmp_table_size=35M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=69M
key_buffer_size=55M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K
innodb_additional_mem_pool_size=3M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=2M
innodb_buffer_pool_size=107M
innodb_log_file_size=54M
innodb_thread_concurrency=10
Obrigado
Mikhas
Outubro 29, 2012, 7:12pm
#2
Esta lenta a execução da query (em um client mysql por ex.) ou para a aplicação executar e carregar os objetos?
Opá Mikhas, para carregar os objetos. A demora é somente na primeira carga, depois que a lista esta preenchida a performance é tranquila com os 30.000 registros.
Obrigado.
Mikhas
Outubro 29, 2012, 7:23pm
#4
Bem, não sei a natureza do seu sistema, mas talvez você possa fazer um pre-caching da entidade Participante quando seu sistema subir. Alguma configuração de caching na sua aplicação também pode ajudar.
Isso considerando que se vc executar um sql equivalente, a performance será satisfatória.
rock
Outubro 29, 2012, 7:23pm
#5
cristianoassis, carregar tudo isto para a memória pode ser pesado mesmo. Já verificou o tempo que a consulta está levando?
:idea: minha sugestão é fazer paginação dos resultados.
Legal,
Verifiquei que existe o componente datatable lazymodel do primefaces, que parece que vai me atender. So não sei ainda como implementar.
Obrigado.
[quote=cristianoassis]Legal,
Verifiquei que existe o componente datatable lazymodel do primefaces, que parece que vai me atender. So não sei ainda como implementar.
Obrigado. [/quote]Opa, problema resolvido: Lazy JSF Datatable Pagination (Primefaces) .
Obrigado Pessoal!
Uma dúvida, eu consigo implementar essa mesma solução para o
p:selectOneMenu
? Pois nesse também preciso carregar os +/- 30.000
Cara, acho que ninguém procuraria algo em um selectOneMenu com 30mil registros. Já pensou em usar o autoComplete do primefaces?
Como devo passar por parâmetros os atributos “setFirstResult” e setMaxResults" na query abaixo ?
public List<Participante> getAllParticipantes(int idEmpresa) {
return getList(Participante.class,"select particip "
+ "from Participante particip, Empresa emp "
+ "where particip.empresa = emp and emp.id = ?1 and "
+ "(particip.deletado != 'S' or particip.deletado is null) ", idEmpresa);
}
Obrigado.
Achei !
public <T> List<T> getLimitedList(Class<T> classToCast,String query, int limit, Object...values) {
Query qr = createQuery(query, values);
qr.setMaxResults(limit);
return qr.getResultList();
}
Obrigado!
Pessoal,
Consegui implementar a solução numa boa. Ficou super rápido a carga no “p:dataTable”. O único problema esta sendo quando seleciono a linha para editar ou remover o registro. Fica super lento. Alguém tem alguma dica ?
<p:dataTable id="tbl" var="item" value="#{participanteFace.participantes}"
selection="#{participanteFace.selectedLinha}" selectionMode="single"
paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15"
emptyMessage="Não há registros a exibir"
rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}"
rowIndexVar="rowIx"
style="font-size: 11px; background-color: lightblue">
<f:facet name="header">
Lista de participantes
</f:facet>
<p:column sortBy="#{item.codigo}" filterBy="#{item.codigo}">
<f:facet name="header">
<h:outputText value="Codigo"/>
</f:facet>
<h:outputText value="#{item.codigo}"/>
</p:column>
<p:column sortBy="#{item.nomefantasia}" filterBy="#{item.nomefantasia}">
<f:facet name="header">
<h:outputText value="Nome Fantasia"/>
</f:facet>
<h:outputText value="#{item.nomefantasia}"/>
</p:column>
<p:column sortBy="#{item.razaosocial}" filterBy="#{item.razaosocial}">
<f:facet name="header">
<h:outputText value="Razão Social"/>
</f:facet>
<h:outputText value="#{item.razaosocial}"/>
</p:column>
<p:column sortBy="#{item.matriz.nomefantasia}" filterBy="#{item.matriz.nomefantasia}">
<f:facet name="header">
<h:outputText value="Matriz"/>
</f:facet>
<h:outputText value="#{item.matriz.nomefantasia}"/>
</p:column>
<p:column sortBy="#{item.tipo}" filterBy="#{item.tipo}">
<f:facet name="header">
<h:outputText value="Tipo"/>
</f:facet>
<h:outputText value="#{item.tipo}"/>
</p:column>
<p:column style="width:90px">
<f:facet name="header">
<h:outputText value="Ação"/>
</f:facet>
<h:commandLink title="Editar registro" action="#{participanteFace.doEditParticipante()}" id="bt_editar" >
<p:graphicImage title="Editar registro" value="#{pageContext.servletContext.contextPath}/resources/imagens/editar.png" width="20" height="20" alt="Editar registro" />
<f:setPropertyActionListener target="#{participanteFace.selectedLinha}" value="#{item}"/>
</h:commandLink>
<h:commandLink title="Consultar registro" action="#{participanteFace.doViewParticipante()}" id="bt_view" >
<p:graphicImage title="Consultar registro" value="#{pageContext.servletContext.contextPath}/resources/imagens/detalhar.png" width="20" height="20" alt="Consultar registro" />
<f:setPropertyActionListener target="#{participanteFace.selectedLinha}" value="#{item}"/>
</h:commandLink>
<h:commandLink title="Remover registro" action="#{participanteFace.doRemoveParticipante()}" id="bt_excluir" onclick="return confirm('Confirme eliminação ?');">
<p:graphicImage title="Remover registro" value="#{pageContext.servletContext.contextPath}/resources/imagens/excluir.png" width="20" height="20" alt="Remover registro" />
<f:setPropertyActionListener target="#{participanteFace.selectedLinha}" value="#{item}"/>
</h:commandLink>
</p:column>
</p:dataTable>
Obrigado !
Resolvido! O problema estava em outra lista também com muitos dados. Substitui para lazyload e ficou ótimo!
Obrigado pela ajuda!!!