otimização <a4j:support />

100 views
Skip to first unread message

André Henrique

unread,
May 26, 2010, 1:27:24 PM5/26/10
to jav...@googlegroups.com
Dae galera!

To com um problema aqui meio chato que é o seguinte, minha tela tem muito conteudo, incluido uma listagem (dataTable) com milhares de registros, e filtros e etc... na propria dataTable eu tenho um botão(imagem) que quando eu clico nele carrega uma modalPanel com uma lista, como se fosse um mestre-detalhe.

Para carregar a modal eu utilizo:

<h:graphicImage url="/images/history.png"  style="cursor:pointer;hand;"
                                        rendered="#{row.type =='Metric'}">
                            <a4j:support event="onclick" immediate="true" ajaxSingle="true"
                                         onsubmit="#{rich:component('ajaxLoading')}.show();"
                                         action="#{geralMetricServiceListController.editObject}"
                                         reRender="historyMetric,dtHistoryMetric,dsHistoryMetric"
                                         oncomplete="#{rich:component('ajaxLoading')}.hide();#{rich:component('historyMetric')}.show();">
                                <f:param value="#{row.name}" name="nameHistory"/>
                                <f:param value="#{row.type}" name="type"/>
                                <f:param value="#{row.idMetricService}" name="idMetricService"/>
                            </a4j:support>
                        </h:graphicImage>

O problema eh que ta muito lento!

O que eu andei percebendo é que mesmo utilizando o immediate="true" e ajaxSingle="true", ele passa no get de todos outros componentes da tela, repopulando muitas listas e etc... então eu comecei a colocar uns if's nos get dos objetos... gambiarra pra solucionar isso...

Alguem tem idéias pra tunar o carregamento da listagem dessa minha modalPanel? eu aindei implementando paginação pras dataTable e ainda assim está lento.

Att.

Kirmaier Andrade

unread,
May 26, 2010, 1:45:19 PM5/26/10
to jav...@googlegroups.com
Olá,

Tive problemas com performance esses dias, acho que posso ajudar-lhe.

O uso de immediate="true" e ajaxSingle="true" é o seguinte:

immediate = Ele pula a fase de validação do JSF, tendo uma melhoria na performance, concerteza!
ajaxSingle = Ele envia apenas o valor que você está passando na action, seja botão, link etc. E funciona sim!

O seu problema é a falta do uso do "limitToList".

limitToList = É um atributo boolean que tem o principio de dizer ao seu reRender que ele irá renderizar APENAS os id's que estiverem no seu reRender. EXEMPLO:


<a4j:support event="onclick" immediate="true" ajaxSingle="true"
                              
           onsubmit="#{rich:component('ajaxLoading')}.show();"
                                         action="#{geralMetricServiceListController.editObject}"
                                         reRender="historyMetric,dtHistoryMetric,dsHistoryMetric"
                                         oncomplete="#{rich:component('ajaxLoading')}.hide();#{rich:component('historyMetric')}.show();"
                                            limitToList="true">

Sugiro também que utilize o process, que faz sendo utilizado junto destes citados acima, aumenta o seu desempenho. O process diz que ao enviar a sua action, ele vai reRenderizar os id's (x, xx,) e que ele precisa do processo="valorObj" para realizar isso.

No meu sistema, como já estamos em fase final, a mudança na utilização seria muita coisa, então, com apenas o uso do limitToList, tivemos um ganho gigante na performance.

Espero ter ajudado.

good luck ;-)

2010/5/26 André Henrique <maye...@gmail.com>

--
Você recebeu essa mensagem por que é membro do "JavaSF: JavaServer Faces Group" em http://groups.google.com/group/javasf
Para postar no grupo envie para jav...@googlegroups.com



--
[]'s,
Kirmaier Barbosa de Andrade
http://kirmaier.blogspot.com/

André Oliveira

unread,
May 26, 2010, 1:46:27 PM5/26/10
to jav...@googlegroups.com
Boa tarde,

eu echo que a propriedade limitToList="true" pode te ajudar, deve usa-lo no a4j:support

Abraço,

--

Rafael Ponte

unread,
May 26, 2010, 2:28:55 PM5/26/10
to jav...@googlegroups.com
Aqui tem algumas boas práticas com relação ao Richfaces,
http://www.slideshare.net/rponte/boas-prticas-com-javaserver-faces-jsf-presentation

:-)

2010/5/26 André Oliveira <andre...@gmail.com>



--
Rafael Ponte
http://www.rponte.com.br

Rafael de Paula Souza

unread,
May 26, 2010, 2:45:57 PM5/26/10
to jav...@googlegroups.com
Kirmaier,

Vou fazer uma observação sobre o limitToList.

Sua definição:


limitToList = É um atributo boolean que tem o principio de dizer ao seu reRender que ele irá renderizar APENAS os id's que estiverem no seu reRender.

Mas, sem o limitToList apenas os id's que estiverem no seu reRender serão "rerenderizados", a menos que você tenha componentes com o atributo ajaxRendered = "true". Então não vejo porque ganhar tanta performance usando o limitToList = "true", ele é mais um atributo para ajudar em situações específicas.

--
Rafael de Paula Souza

Sublimus - Desenvolvimento de Software e Soluções Web.
www.sublimus.com.br

Kirmaier Andrade

unread,
May 26, 2010, 2:52:33 PM5/26/10
to jav...@googlegroups.com
Rafael,

Lembrando que o ajaxRendered é default true, em a:panel, a:outPutPanel e a:form, então, se você utiliza um destes componentes na página, os get's de todos serão invocados.

Você pode também fazer o uso do a:region, onde você delimita uma região especifica a ser renderizada.

2010/5/26 Rafael de Paula Souza <rafae...@gmail.com>

Rafael de Paula Souza

unread,
May 26, 2010, 3:08:34 PM5/26/10
to jav...@googlegroups.com
Kirmaier,

No guia do desenvolvedor do richfaces só os seguintes componentes tem o atributo ajaxRendered:

a4j:outputPanel - default false
a4j:include - default true
rich:message - default true
rich:messages - default true

Então faz mais sentido você modificar para, por exemplo, <a4j:include ajaxRendered = false> do que espalhar limitToList em todos componentes que fazem request ajax.


--
Rafael de Paula Souza

Sublimus - Desenvolvimento de Software e Soluções Web.
www.sublimus.com.br




André Henrique

unread,
May 26, 2010, 3:33:29 PM5/26/10
to jav...@googlegroups.com
bah valeu pessoal!

combinei o process e o limitToList e o reRender e tenho a impressão que ficou mais rapido mesmo! Vou testar melhor... tem algo mais que eu possa fazer pra tunar o codigo?


<h:graphicImage url="/images/history.png"  style="cursor:pointer;hand;"
                                        rendered="#{row.type =='Metric'}">
                            <a4j:support event="onclick" immediate="true" ajaxSingle="true" limitToList="true" process="d,e,f"

                                         onsubmit="#{rich:component('ajaxLoading')}.show();"
                                         action="#{geralMetricServiceListController.editObject}"
                                         reRender="historyMetric,dtHistoryMetric,dsHistoryMetric"
                                         oncomplete="#{rich:component('ajaxLoading')}.hide();#{rich:component('historyMetric')}.show();">
                                <f:param id="d" value="#{row.name}" name="nameHistory"/>
                                <f:param id="e" value="#{row.type}" name="type"/>
                                <f:param id="f" value="#{row.idMetricService}" name="idMetricService"/>
                            </a4j:support>
                        </h:graphicImage>

Kirmaier Andrade

unread,
May 26, 2010, 3:38:40 PM5/26/10
to jav...@googlegroups.com
Que bom que lhe valew de algo essas idéias.
A principio, é isso. O richFaces possui outras configurações que podem lhe trazer ganhos também, mas, são mais trabalhosos, diria assim, como o eventQueue.

Kirmaier Andrade

unread,
May 26, 2010, 4:02:50 PM5/26/10
to jav...@googlegroups.com
Fiz até um post no blog, mostrando sobre estes recursos de maneira mais detalhada.

http://kirmaier.blogspot.com/2010/05/este-post-nasceu-por-causa-de-uma.html

2010/5/26 Kirmaier Andrade <kirm...@gmail.com>
Reply all
Reply to author
Forward
0 new messages