使用Ajax请求时JSF性能问题

4
我正在寻找一个运行在JBoss上的Web应用程序中的瓶颈。 我有一个包含表单的模块,当从字段移动到字段时,我会使用Ajax对数据进行一些服务器端验证(这些验证需要不到1毫秒)。 这些模块用于两个单独的Web应用程序:
- 运行在Apache Tomcat应用服务器上的一个,其中每个验证大约需要200-400毫秒; - 第二个运行在JBoss 7.1.1上,其中每个验证大约需要3-5秒钟。问题在于我与Tomcat上使用的完全相同的模块,并且5秒钟的延迟真的不是一个选择。
我已经尽可能测量了时间,但是在运行在JBoss上的应用程序中找不到任何瓶颈。因此,我使用JProfiler和线程转储来查找问题。 下面是结果的屏幕截图。对我来说,它看起来像是jsf / richfaces的问题,但我不确定确切的原因以及如何修复它。
我正在使用:
- 已修补的jsf-impl-2.1.19-redhat-1的jboss 7.1.1 - Richfaces 4.2.3.Final - jboss-jsf-api_2.1_spec-2.1.19.Final-redhat-1
我尝试过的是:使用最新版本的richfaces,将jsf的viewstate更改为服务器端,启用部分状态保存。
下面是JProfiler的屏幕截图:
![](https://istack.dev59.com/Li624.webp)
从上面的屏幕截图中,我认为此处的性能问题在于javax.faces.view.facelets.ComponentHandler.applyNextHeader。 我无计可施,任何提示都将不胜感激。

1
你不应该这样做。Web延迟很容易超过你在Tomcat中观察到的延迟。你应该将每个字段的AJAX调用限制在严格必要的范围内,并尽可能多地在提交时完成。 - user207421
请注意,屏幕截图中显示的测量执行时间是累计的。 - BalusC
Balrus: 是的,我知道它是累积的,我只是试图衡量哪个部分花费的时间最长。 EJP:是的,我尽量限制调用次数,但是ajax调用是从同一个模块中进行的,该模块被包含在两个不同的Web应用程序中,所以调用应该是相同的。 - Ivo
1个回答

2

如果您的JSF PROJECT_STAGE是开发阶段,请尝试将其更改为生产阶段。

您可以通过从web.xml中删除名称为javax.faces.PROJECT_STAGE<context-param>,或将其值设置为Production而不是Development来实现。


这个有效,你能否请包括开发阶段导致此问题的原因? - Ivo
1
PROJECT_STATE信息允许JSF实现优化其当前阶段的行为。例如,JSF实现可能提供比生产环境更详细的开发时诊断信息。这样做可以提供更好的错误信息,但这也会损失一些性能。 - s-rusev

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