2013-08-11 3 views
1

Я использую реализацию Mojarra JSF (версия 2.2.1). У меня есть большая проблема с производительностью во время запросов ajax.JSF ajax проблема с производительностью при использовании большого количества компонентов

На моей странице много компонентов, поэтому я понимаю, почему первый рендеринг занимает много времени, но что с помощью ajax-запросов?

Они занимают много времени, хотя почти ничего не делают. Вот мой упрощенный пример:

В приведенном ниже примере, нажав кнопку «тест производительности» занимает несколько мс:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html"> 

    <h:body> 
     Hello World 
     <h:form> 
      <h:commandButton value="performance test"> 
       <f:ajax execute="@this" render="@none" /> 
      </h:commandButton> 
     </h:form> 
    </h:body> 
</html> 

Но если добавить 1000 <h:inputText /> элементов в <h:form></h:form> то же действие происходит над 100мс!

Я проверил, что 80% времени потребляется в фазе RESTORE_VIEW, 20% в фазе RENDER_RESPONSE, остальная часть фаз не занимает значительного времени.

Есть ли возможность исправить это?

Я также попытался отключить javax.faces.PARTIAL_STATE_SAVING (потребление памяти не проблема в моем случае), но и без каких-либо успехов.

РЕДАКТИРОВАТЬ: Тысяча <h:inputText> добавляют к <h:form> только упрощенный пример. Я просто хотел подчеркнуть тот факт, что большое количество компонентов оказывает существенное влияние на запрос ajax (что почти ничего не делает), что является серьезной проблемой на моем сайте.

В реальности, конечно, у меня нет 1000 входов. Я показываю очень большую таблицу с большим количеством данных - если данные пусты в любой ячейке, то вместо этого должен быть дефис. Я использовал композитный компонент для этого - где у меня было более одного ui:fragment с render=true/false

Сегодня я попытался использовать свой собственный компонент вместо составного, а время отклика и использование памяти уменьшились.

Но я все еще не удовлетворен тем, что мой очень простой запрос ajax на этой странице занимает гораздо больше времени, чем тот же самый запрос ajax, который используется на другом - более тонкая страница (т. Е. С меньшим количеством компонентов). Разве это не проблема архитектуры JSF?

+1

100 мс для формы монстра с полями ввода 1К очень аккуратно. С другой стороны, мне интересно, кто когда-либо заполняет такую ​​форму монстра. Возможно, вам нужно ввести некоторую систему поиска/фильтрации, как это делает Google? Google также не показывает все результаты за один раз без какой-либо формы поиска/фильтрации. – BalusC

+0

Можно ли переключить реализацию JSF на MyFaces? Согласно этому блогу http://blog.oio.de/2013/04/08/jsf-comparison-myfaces-vs-mojarra/ реализация (Mojarra vs MyFaces) оказывает влияние на большие деревья компонентов. – cheffe

+0

@BalusC: Спасибо за ваш ответ. См. Раздел редактирования в моем вопросе. Я уточнил описание моей проблемы. – chrosciu

ответ

1

Не совсем, JSF всегда восстанавливает все дерево компонентов в фазе восстановления. В этом случае вам будет лучше с <ui:repeat>, но я понимаю, что ваш тест является искусственным, а на реальной странице может быть множество уникальных компонентов.

Существует довольно много способов уменьшить количество компонентов, например, упомянутых <ui:repeat>. Также вы можете использовать простой html в ваших facelets. Куски html, свободные от тегов JSF, представлены как один компонент UIInstructions. Тем не менее вы можете использовать выражения EL там. Трудно рекомендовать что-то конкретное без каких-либо подробностей вашего проблемного сценария.

EDIT: Дерево компонентов восстанавливается сверху вниз, не знаю, возможно ли его каким-то образом оптимизировать его и пропустить части, не нужные по запросу. Проблема в том, что вы не знаете, в какой части узлов компонента с конкретным идентификатором, указанным в теге ajax, вы можете только попытаться сделать некоторые оптимизации. Похоже, авторы не рассматривали эти осложнения, заслуживающие внимания.

Что касается нескольких условных разделов - я не нашел ничего, непосредственно поддерживающего это в JSF. Специальный пользовательский компонент звучит как лучший выбор здесь. Мы сделали что-то подобное, нашу собственную реализацию <ui:include>, которая поддерживает динамический атрибут src, работающий внутри <ui:repeat>.

+0

Я использовал ваш совет - см. раздел редактирования в моем вопросе. Но зачем «JSF всегда восстанавливает все дерево компонентов в фазе восстановления»? Потребуется много ценного процессорного времени, когда это нелогично (на мой взгляд). – chrosciu

+0

Обновлен мой ответ. – mrembisz

+0

Нет проблем с архитектурой JSF. Я думаю, что это ошибка в Мохарре. Вместо этого попробуйте MyFaces 2.1.x, и вы увидите разницу. Реализация в MyFaces для составных компонентов полностью отличается от реализации в Mojarra. При использовании составных компонентов существует небольшое влияние, но в большинстве случаев оно действительно окупается. – lu4242

Смежные вопросы