Проблема с производительностью платформы диалога Primefaces

мы создаем веб-сайт Java EE 7 и в некоторых ситуациях возникают проблемы с производительностью.

Мы используем следующие компоненты и технологии: Java 1.7 JSF 2.2 EclipseLink 2.5.1 PrimeFaces 4.0 Glassfish Server 4.0 Advantage Database Server 10.10

Итак, в чем именно наша проблема? На нашей главной странице (около 2000 элементов DOM, в основном элементы JSF и Primefaces) мы используем actionListener-Tag p:commandButton для вызова метода Java в компоненте поддержки, который открывает диалог (JaNeinDialog) диалогового фреймворка Primefaces.

Поскольку наш JaNeinDialog довольно прост, мы ожидаем, что он будет открыт в браузере (firefox 27.0.1) почти сразу. Но на самом деле, это занимает 1-2 секунды, прежде чем он будет виден.

Удивительно, но мы обнаружили, что это время ожидания напрямую зависит от исходного места, откуда она была вызвана: Как только эта commandLink находится внутри очень простой xhtml-страницы, мы видим то, что и ожидали: открывается диалоговое окно почти без задержек.

Так вот вопрос: почему время загрузки одного и того же диалога зависит от сложности страницы, откуда он был вызван?

p:CommandButton, который вызывает метод Java для открытия JaNeinDialog:

<p:commandLink ajax="true" process="@this"
actionListener="#{patientController.starteMitarbeiterSucheDialog()}">
<p:graphicImage value="/resources/img/png/find_1.png" width="18"
height="21" title="Suche nach Mitarbeiter" />
<p:ajax event="dialogReturn" update="editPflegeDatenPanel"
listener="#{patientController.setPatientMitarbeiter}" />
</p:commandLink>

JaNeinDialog.xhtml:

 <!DOCTYPE html>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<title><h:outputText
value="#{stringKonstanten.jaNeinDialogTitel}"/></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"></meta>
<h:outputStylesheet library="css" name="jortho.css" />
</h:head>
<h:body>
<h:form>
<center>
<p:panelGrid id="JaNeinDialogPanel" cellspacing="5">
<p:row>
<p:column colspan="2">
<center>
<h:outputText value="#{jaNeinDialogController.dialogText}" />
</center>
</p:column>
</p:row>
<p:row>
<p:column colspan="2">
<center>
<h:outputText value="Aktion ausführen?" />
<BR />
<BR />
</center>
</p:column>
</p:row>
<p:row>
<p:column>
<center>
<p:commandButton id="positiveButton"
actionListener="#{jaNeinDialogController.entscheidungWeiterleiten(true)}"
value="#{stringKonstanten.ja}" icon="ui-icon-check" />
<p:commandButton id="negativeButton"
actionListener="#{jaNeinDialogController.entscheidungWeiterleiten(false)}"
value="#{stringKonstanten.nein}" icon="ui-icon-close" />
</center>
</p:column>
</p:row>
</p:panelGrid>
</center>
</h:form>
</h:body>
</ui:composition>

Используемая версия JSF — это стандартная реализация Mojarra 2.2.0, которая поставляется вместе с сервером Glassfish 4.

Мы также проверили, что в разделе body не загружаются скрипты. В разделе head загружаются только 2 скрипта.

Пробуя предложение с очисткой, мы следовали инструкциям BalusC в Как очистить буфер раньше в JSF 2.0?, чтобы сократить время ожидания ответа. Действительно, это время ожидания уменьшилось примерно на 150 мс, но сопровождалось некоторыми странными побочными эффектами. Поскольку BalusC не рекомендует использовать этот подход, мы отменили эти изменения.

Используя Firefox-плагин YSlow, мы измерили время отклика до появления диалогового окна. Время ожидания первого элемента (main.xhtml) занимает более 800 мс. Но размер этого первого элемента всего 987 байт. Так как же узнать, что именно происходит во время ожидания первого элемента?

Мы узнали из https://blog.oio.de/2013/05/06/jsf-performance-tuning/ что изменение реализации JSF с Mojarra на MyFaces значительно повысит производительность, и мы попытаемся изменить ее прямо сейчас на нашем веб-сервере Glassfish.

Мы будем очень признательны за любую помощь. Заранее большое спасибо!

ОБНОВИТЬ:

Как было предложено в lu4242 (большое спасибо за вашу помощь!), мы попытались изменить реализацию JSF с Mojarra 2.2.0 на MyFaces. К сожалению, после этого мы не смогли развернуть наше приложение. Вся процедура описана здесь: mo">Приложение Java EE 7 не развертывается на сервере Glassfish 4 после перехода с Mojarra на MyFaces

После этого мы узнали из http://blog.oio.de/2013/05/16/jsf-performance-mojarra-improves-dramatically-with-latest-release/ что начиная с Mojarra версии 2.1.22 значительная потеря производительности для сайтов исправлено большое количество элементов DOM.

Поэтому мы обновили Mojarra с версии 2.2.0 до 2.2.6, но время ожидания по-прежнему не улучшилось. Независимо от того, что мы делаем на нашей главной странице, у нас все еще есть время ожидания около 700 мс.

YSlow показывает, что размер данных, передаваемых с сервера в браузер, минимален (менее 10 КБ). Но главная страница слишком долго загружает сервер.

Итак, мы будем признательны за любые дополнительные советы по этой теме.

Заранее большое спасибо.


person user3218708    schedule 19.03.2014    source источник
comment
Какую реализацию JSF вы используете? вам нужно проверить, загружен ли скрипт внутри секции body, и попытаться загрузить их в часть ‹head›, но этого недостаточно, вам нужно заранее сбросить элемент ‹head›.   -  person lu4242    schedule 20.03.2014
comment
Мы ответили на вопрос и добавили дополнительную информацию.   -  person user3218708    schedule 20.03.2014
comment
Если вы попробуете MyFaces, есть параметр веб-конфигурации для ранней очистки org.apache.myfaces.EARLY_FLUSH_ENABLED. Я не согласен с рекомендацией этого (его можно использовать), потому что большинство ошибок происходит до ответа на рендеринг, и вы можете принудительно создать сеанс раньше, если это необходимо, просто вызвав externalContext.getSession(true) из слушателя фазы (хорошая идея для параметра в MyFaces ). Думаю, с MyFaces вы решите проблему с производительностью.   -  person lu4242    schedule 20.03.2014
comment
Я забыл сказать, взгляните на эту статью Понимание Производительность JSF 2.0 — часть 3. Это помогает понять, что происходит, и пример приложения MyFaces на github ЗДЕСЬ показывает конфигурацию, обеспечивающую максимально возможную производительность.   -  person lu4242    schedule 20.03.2014
comment
Мы обновили наш пост новой информацией...   -  person user3218708    schedule 26.03.2014