1

我们正在构建一个 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 元素)中,我们使用 ap:commandButton 的 actionListener-Tag 来调用支持 bean 中的 Java 方法,该方法打开 primefaces 对话框框架的对话框 (JaNeinDialog)。

由于我们的 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 版本是 Glassfish 4 服务器随附的标准 Mojarra 2.2.0 实现。

我们还检查了正文部分中没有加载任何脚本。在 head 部分中只加载了 2 个脚本。

尝试使用刷新的建议,我们遵循了 BalusCs 关于 如何在 JSF 2.0 早期刷新缓冲区的指示?以减少响应的等待时间。事实上,这个等待时间减少了大约 150 毫秒,但伴随着一些奇怪的副作用。由于 BalusC 不建议使用这种方法,因此我们恢复了此更改。

使用 Firefox 插件 YSlow,我们测量了对话框出现之前的响应时间。第一个元素 (main.xhtml) 的等待时间超过 800 毫秒。但是这个第一个元素的大小只有 987 B。那么,我们怎样才能知道,第一个元素的等待时间到底发生了什么?

我们从https://blog.oio.de/2013/05/06/jsf-performance-tuning/了解到,将 JSF 实现从 Mojarra 更改为 MyFaces 将显着提高性能,我们现在将尝试在我们的Glassfish 网络服务器。

我们将不胜感激任何帮助。提前非常感谢!

更新:

就像 lu4242 建议的那样(非常感谢您的帮助!),我们尝试将 JSF 实现从 Mojarra 2.2.0 更改为 MyFaces。不幸的是,在我们这样做之后,我们无法部署我们的应用程序。此处描述了整个过程: Java EE 7 Application not deploying on Glassfish 4 Sever after switch from Mojarra to 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 表明,从服务器传输到浏览器的数据量很小(小于 10KB)。但是主页使服务器忙碌了很长时间。

因此,我们将不胜感激有关此主题的更多提示。

提前非常感谢。

4

0 回答 0