为什么在Wildfly上部分渲染ajax请求时,JSF 2.2需要更多的时间?

5
我正在将一个项目从(JSF1.2,Richfaces 3.3.4运行在JBoss 4.2.3上)迁移到(JSF2.2,Richfaces 4.5运行在Wildfly 8.1.0上)。在部分迁移了一些视图后,我发现使用JSF2的应用程序性能非常差。
当发送Ajax请求时,我注意到这个问题,JSF2会渲染整个视图,尽管render属性指向一个outputText。
例如(可以从HERE下载)
在我的示例中,我将为JSF1.2和2.2使用相同的代码示例。然后,我将多次单击ajax按钮,并使用Chrome检查工具测量每个请求的响应时间。
给定以下index1.XHTML,使用JSF1.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”多次,平均时间为15毫秒:

enter image description here

给定以下使用JSF 2.2和Richfaces 4.5.0的index2.XHTML。
<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”多次,平均时间为18毫秒:

enter image description here

好的,目前为止还不错。现在问题出现在当我添加以下的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。

enter image description here

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

enter image description here

这句话的意思是“JSF 2比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是否应该这样工作,或者我是否在误用它。**
提前感谢, Tefa

1
为什么要投反对票?如果您认为我误解了什么,我会很感激您能向我解释。 - TeFa
我不确定为什么你被踩了。你的问题很好。你试过没有使用Richfaces进行测试吗? - Ali Cheaito
是的,我在JSF 2中没有使用RichFaces,但仍然遇到了同样的问题。 - TeFa
3个回答

4

我终于找到了为什么使用Wildfly时,AJAX响应对我很慢的原因。

事实证明,这种性能问题与JSF版本或mojarra版本无关。它实际上与Wildfly配置有关(具体来说是Weld)。

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

要在Wildfly中启用/禁用weld,只需从"{JBOSS_HOME}/standalone/configuration"中找到standalone.xml并添加/删除以下2行(扩展和子系统):

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

如果您取消焊接并尝试我在问题中提到的示例,那么您应该会在Ajax响应中遇到延迟。我不知道为什么禁用焊接会导致这个问题,但这是一个不同的问题,与当前问题无关。希望这可以帮助某些人。

0
我测试了您的示例,但是使用了知名的 Primefaces 而不是 Richfaces。每次按钮点击都需要12毫秒的响应时间。我怀疑Richfaces命令按钮JavaScript代码可能有问题。您可以下载Primefaces,执行相同的测试,然后回到这里告诉我它是更快还是更慢。

Jsf 2.2 300 outputText with Primefaces


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

0

我使用了一个h:commandButton和300个outputTexts,这些outputTexts绑定到一个bean属性,并用panelGroup包装起来,运行了您的示例,没有使用Richfaces。虽然有一些差异,但并不是非常明显。然而,创建一个JIRA问题让Mojarra团队研究一下可能是值得的。

以下是我的结果。我丢弃了第一个请求以排除任何初始化效果。也许最明显的区别是在最后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毫秒。 - TeFa
我的结果来自于 jBoss EAP 6.3 和 Mojarra 2.1.28,以及 Wildfly 8.1.0 服务器。 - Ali Cheaito
尽管我将wildfly 8.1.0中的Mojarra从2.2.6升级到2.2.8,但我仍然面临着相同的性能问题。我更新了我的问题(更新2),你能否请检查一下。感谢你的时间。 - TeFa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接