我使用 JSF 的 Mojarra 实现(版本 2.2.1)。我在 ajax 请求期间的性能存在很大问题。
我的页面有很多组件,所以我明白为什么第一次渲染需要很多时间,但是 ajax 请求呢?
他们也需要很多时间,尽管他们几乎什么都不做。这是我的简化示例:
在下面的示例中,按下“性能测试”按钮需要几个毫秒:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
Hello World
<h:form>
<h:commandButton value="performance test">
<f:ajax execute="@this" render="@none" />
</h:commandButton>
</h:form>
</h:body>
</html>
但是如果将 1000 个<h:inputText />
元素添加到<h:form></h:form>
同一个动作中需要超过 100 毫秒!
我检查了 RESTORE_VIEW 阶段消耗了 80% 的时间,RENDER_RESPONSE 阶段消耗了 20% 的时间,其余阶段不需要花费大量时间。
有没有可能修复它?
我还尝试禁用 javax.faces.PARTIAL_STATE_SAVING (在我的情况下内存消耗不是问题)但也没有任何成功。
编辑:
一千个<h:inputText>
添加到 a<h:form>
只是一个简化的例子。我只是想强调一个事实,即大量组件对 ajax 请求有重大影响(几乎什么都不做)——这在我的网站上是一个严重的问题。
当然,在现实中,我没有 1000 个输入。我显示包含大量数据的非常大的表格 - 如果任何单元格中的数据为空,则应该使用连字符代替。ui:fragment
我为此使用了复合组件-我有多个render=true/false
今天我尝试使用我自己的组件而不是复合组件 - 响应时间和内存使用量减少了。
但我仍然不满意,因为我在该页面上的非常简单的 ajax 请求比在另一个更薄的页面(即组件数量更少)上使用的相同 ajax 请求花费的时间要多得多。这不是任何 JSF 架构问题吗?