【发布时间】:2015-03-21 16:23:58
【问题描述】:
我正在使用 JSF 2.2 + Primefaces 开发一个 WebApp...项目正在快速增长,第一次性能测试非常糟糕(由于我对 JSF 生命周期以及非功能性需求的了解不足 - 即完全 ajax网站),那么我们可以改进一点,但结果仍然不如预期。 (根据动作,我们有 300~1500 毫秒的时间,想法是在 500 毫秒左右进行一次表演,给予或接受)。主要是 Restore View 阶段和 Render Response 是时间消费者(在其他阶段,花费的时间毫无价值)。对于某些操作,Invoke Application 也需要时间(由于 DB 调用)。
在阅读了网络上的大量文章后,有很多很棒的技巧需要考虑(当然很多来自 StackOverflow),例如:
- 改进数据库查询
我们有一些复杂的查询是通过两个 Hibernate Criteria 查询完成的,所以我们必须在这里工作。 (也许使用纯 SQL 查询,复杂的使用子查询?)
- 永远不要在 Bean 的 getter 上定义业务逻辑
知道了!
- 将适当的范围设置为 bean 并在其上存储必要的东西
我们有一个完整的 ajax 站点,所以 View Scoped 对我们来说几乎是 Session Scoped,我们使用 SessionBeans 作为一种“缓存”来存储我们不希望每次都从 DB 获取的关键数据 +在这里定义业务逻辑。
- 选择正确的 JSF 状态保存方法 - Client Vs Server
为此,我必须进行更多研究,检查各种可能性及其优缺点,然后测试每种可能性。
到目前为止非常清楚,现在一些我有疑问的额外提示。
- 尽可能使用原版 HTML,最好使用 h: 标签而不是 p: 标签
纯 HTML 清晰且有意义,现在介于 h: 和 p: 之间,它值多少钱?例如。
<p:commandButton value="Value"
styleClass="class"
actionListener="#{myBean.doStuff()}"
ajax="true" process="@form" update="@form"
onsuccess="jsFunction()" />
对
<h:commandButton value="Value"
styleClass="class"
actionListener="#{myBean.doStuff()}" >
<f:ajax execute="@form" render="@form" event="onclick" />
</h:commandButton>
或
<ui:fragment... vs <p:fragment...
或
<p:outputLabel value="#{myBean.value}" rendered="#{myBean.shouldRender}" />
对
<ui:fragment rendered="#{myBean.shouldRender}">
<label>#{myBean.value}</label>
</ui:fragment>
我一直在混合使用 Primefaces 和 Jsf 标签和一些纯 HTML 有一段时间了。(主要是 PF,因为它们的组件特性)我现在纯 HTML 总是更快,但在 JSF 和另一个框架?如果我这样做,更改它会花费大量时间,而且我不喜欢知道它根本不会产生相关影响的结果。
- 自定义 Facelets 标签与复合组件
我认为这是关键。仍然对它们的差异有一些疑问,在两者的实现上,CC 使用起来非常简单和灵活,但缺点是它们完全包含在 ViewTree 中,并且 JSF 会为每个请求重新生成(如果我没记错的话),虽然 custom tags 似乎使用起来有点复杂(没那么多),但它的优点是只有实际呈现的内容才包含在 ViewTree 中,仅此而已,减少 RESTORE VIEW 的耗时。我们有几个复合组件,没有 Facelets 标签,所以这里有很多工作要做。我仍然没有找到一篇很好的文章来解释它们之间的差异,什么时候应该使用一个,什么时候使用另一个(已经阅读了输入,消息使用 TAGS 以及更复杂的事情 CC)。如果这个想法是更喜欢标签而不是 CC,在这种情况下我别无选择,而不是使用 CC?是否可以在 CC 中使用自定义标签,让 JSF 更轻松地处理它们?
我即将进入修改洞项目的旅程以获得更好的性能,这将需要我几天的时间,我的想法是这次获得更好的结果;所以每一个提示,建议和建议都非常受欢迎!谢谢你们的时间!
【问题讨论】:
-
我将首先测量 300~1500 毫秒的花费,以便您知道需要改进的地方。首先,您可以使用 PhaseListener 来衡量每个阶段花费了多少,这将给出一个模糊的概念,即页面结构或对数据库的访问是否对延迟负责,具体取决于哪个阶段成本最高。此外,如果您有 DAO 层,则可以使用某些方面将调用记录到该层以衡量数据库成本。
-
@Diego 对不起 diego,我忘了在我的问题上添加这个。当然,我一直在用探查器进行测量。渲染响应和恢复视图占用了 98% 的时间
-
如果您有很多输入或复杂的输入,请尝试在 ajax 调用上使用PF partial submit,节省大量时间,还可以尝试使用process attribute 可以做什么...
-
还要检查你是否真的需要在“doStuff()”之后更新完整的表单。如果组件知道要在 ajax 调用中更新哪些其他组件,您很可能根本不需要更新表单,除非您必须完全替换页面
-
这对于 Stack Overflow 来说实在是太宽泛了。它读起来几乎就像一个博客,而不是一个问题。描述并确定性能最佳的消费者,如果您不知道如何改进它,请具体询问有关它的问题。冲洗并重复。
标签: performance jsf jsf-2 primefaces