[RESOLVIDO]Performance

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

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.

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.

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?

Rs…Entendi, vou testar.

Obrigado

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>
                                &nbsp;         
                                <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>
                                &nbsp;         
                                <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!!!