为啥 JSF 2.2 需要更多时间在 Wildfly 上部分呈现 ajax 请求

Posted

技术标签:

【中文标题】为啥 JSF 2.2 需要更多时间在 Wildfly 上部分呈现 ajax 请求【英文标题】:Why JSF 2.2 takes more time partial rendering an ajax request on Wildfly为什么 JSF 2.2 需要更多时间在 Wildfly 上部分呈现 ajax 请求 【发布时间】:2015-02-09 22:38:54 【问题描述】:

我正在将一个项目从(JSF 1.2,Richfaces 3.3.4 在 JBoss 4.2.3 上运行)迁移到(JSF 2.2,Richfaces 4.5 在 Wildfly 8.1.0 上运行)。在部分迁移了一些视图之后,我发现使用 JSF 2 的应用程序的性能很糟糕。

我在发送 ajax 请求时注意到了这个问题,虽然 render 属性指向一个 outputText,但 JSF 2 正在渲染整个视图

示例(可从HERE下载)

在我的示例中,我将为 JSF 1.2 和 2.2 使用相同的代码示例。之后我会多次点击ajax按钮,并使用chrome检查工具测量每个请求的响应时间。

鉴于以下 index1.XHTML 使用 JSF 1.2 和 Richfaces 3.3.4

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a="http://richfaces.org/a4j">
    <head>
    </head>

    <body id="body">
        <!-- Later the outputText elements below will be included here-->
        <h:form>
            <a:commandButton value="TestBtn" reRender="output"/>
        </h:form>
        <h:outputText value="test" id="output"/>
    </body>
</html>

多次点击“TestBtn”,平均耗时15ms:

鉴于以下 index2.XHTML 使用 JSF 2.2 和 Richfaces 4.5.0

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a="http://richfaces.org/a4j">
    <h:head>
    </h:head>

    <h:body id="body">
        <!-- Later the outputText elements below will be included here-->
        <h:form>
            <a:commandButton value="TestBtn" render="output"/>
        </h:form>
        <h:outputText value="test" id="output"/>
    </h:body>
</html>

多次点击“TestBtn”,平均时间为18ms:

嗯,到目前为止一切顺利。现在,当我添加以下 outputText 元素时,性能问题出现了

<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
 ............. (300 times, of course this is just for testing purposes)

我在 index1.xhtml 和 index2.xhtml 中添加了 300 次这些元素并重复了相同的测试

使用 index1.xhtml (JSF 1.2) 的结果,我得到的平均时间为 19ms

使用 index2.xhtml (JSF 2.2) 的结果,我得到的平均时间为 150ms (!!!!!)

这比 JSF 1.2 慢 8 倍

有人能解释一下为什么 JSF 2 比 JSF 1 慢吗?以及如何提高性能?

更新

在 tomcat 服务器上使用元素测试 JSF 2 示例,我得到平均 20 毫秒。我猜这个问题是由 Wildfly 方面引起的。

不幸的是,我无法更改服务器。我应该为 JSF 2 找到一个在 wildfly 上工作的解决方案。

我尝试升级到 wildfly 8.2.0 --> 还是同样的性能问题。

谷歌搜索后我能找到的最接近的问题是POST

所以我将我的 JDK 升级到 jdk1.7.0_71 --> 仍然是同样的性能问题。

更新 2

这里是发送到 Wildfly 服务器的 ajax 请求(单击一次)的日志。 (LOG)

为什么我只是重新渲染一个特定的 ID,但 JSF 会构建整个视图?

** 注意:我不知道这是否是 JSF 假设的工作方式,或者我只是在滥用它。 **

提前致谢, 特发

【问题讨论】:

为什么要投反对票?如果您认为我错过了理解某些内容,如果您能向我解释一下,我将不胜感激。 我不确定你为什么被否决。你有一个很好的问题。你试过没有 Richfaces 的测试吗? 是的,我厌倦了在 JSF 2 中没有richfaces,同样的问题 【参考方案1】:

我终于发现了为什么 Wildfly 的 ajax 响应只对我来说很慢。

原来这个性能问题与JSF版本或mojarra版本无关。其实和Wildfly配置有关(具体说是Weld)

“org.jboss.as.weld”在我的 Wildfly 服务器中被禁用。默认情况下,当您下载 wildfly 时,它已启用。这就是为什么没有人遇到任何性能问题。

要在 Wildfly 中启用/禁用焊接,只需从“JBOSS_HOME/standalone/configuration”(扩展和子系统)中的standalone.xml 中添加/删除以下两行:

<extensions>
    ..............
    <extension module="org.jboss.as.weld"/>
    ..............
</extensions>
<profile>
     ..............
    <subsystem xmlns="urn:jboss:domain:weld:2.0"/>
</profile>

如果您删除焊缝并尝试我在问题中提到的示例,您应该延迟 ajax 响应

我不知道为什么禁用焊接会导致此问题,但这是与当前问题无关的不同问题。

希望这可能对某人有所帮助

【讨论】:

【参考方案2】:

我在没有 Richfaces 的情况下使用 h:commandButton 和 300 个绑定到 bean 属性的 outputTexts 运行了您的示例,并用 panelGroup 包装。虽然有区别,但这不是地球的颤抖。然而,为 Mojarra 团队创建一个 JIRA 问题来研究它可能是值得的。

这是我的结果。我丢弃了第一个请求以排除任何初始化影响。最明显的差异可能是最近 5 个请求的平均值,因为到那时响应时间停止波动(可能进行了一些优化)。

使用 Mojarra 2.2.6:

Sample size: 20
Total time:  2111 ms
Average time: 105.55 ms
STDDEV: 22.01
Last 5 average: 85.40 ms

使用 Mojarra 2.1.28:

Sample size: 20
Total time:  1331 ms
Average time: 66.55 ms
STDDEV: 29.94
Last 5 average: 39.60 ms

【讨论】:

谢谢。我尝试了primefaces,但遇到了同样的问题。在查看了您的结果后,我认为问题可能来自 Wildfly。所以我尝试在 tomcat 服务器上运行示例 ----> 没有问题,我的平均响应时间为 20 毫秒。 我的结果来自 Mojarra 2.1.28 的 jBoss EAP 6.3 和另一个的 Wildfly 8.1.0 服务器 即使我将 Wildfly 8.1.0 中的 Mojarra 从 2.2.6 升级到 2.2.8,我仍然遇到同样的性能问题。我更新了我的问题(更新 2),请您检查一下。感谢您的宝贵时间。【参考方案3】:

我测试了您的示例,但使用了众所周知的 Primefaces 而不是 Richfaces。它为每个按钮单击提供了 12 毫秒的响应时间。我怀疑 Richfaces 命令按钮 javascript 代码可能有问题。你可以下载 Primefaces,进行同样的测试,然后回来告诉我它是更快还是更慢。

【讨论】:

谢谢。我尝试了primefaces,但遇到了同样的问题。在查看了您的结果后,我认为问题可能来自 Wildfly。所以我尝试在 tomcat 服务器上运行示例 ----> 没有问题,我的平均响应时间为 20 毫秒。

以上是关于为啥 JSF 2.2 需要更多时间在 Wildfly 上部分呈现 ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

在 Wildfly 10 上运行 EJB 2.1

JSF 2.2 h:命令按钮触发后的输入文件更新页面

为啥 DataFrame 在 spark 2.2 中仍然存在,甚至 DataSet 在 scala 中也提供了更多的性能? [复制]

JSF 2.2 @ViewScoped 绑定错误?

JSF 2.2 ViewScoped Bean 被多次创建

jsf 2.2(最终版)不适用于 Jboss 7.1.1