使JSF页面的部分变为无状态

3

我正在开发一个JSF应用程序,该应用程序应支持同时登录的大量用户。当我们进行应力测试时,我们发现大部分CPU时间都花在重建和遍历组件树上。

我的第一个想法是尝试使页面的特定部分无状态,并因此从组件树中排除。但是,如果我将一个带有标记为瞬态的f:view的表单元素进行包装:

<f:view transient="true">
    <h:form>
        ....
    </h:form>
</f:view>

所有其他页面上的表单也是无状态的(应该保存状态的隐藏输入字段的'value'属性值为'stateless':)。

是否有一种方法只使页面上特定的表单无状态,或者整个页面可以是无状态或有状态的?

感谢任何帮助!

编辑:

我们使用Mojarra 2.2.7进行实现,同时使用Primefaces 4.0作为组件库和Omnifaces 1.7用于某些实用功能。


你正在使用哪个JSF实现?你正在使用哪些JSF组件库? - lu4242
我已经在初始问题的编辑中添加了它。谢谢! - Nikola
我不清楚Mojarra的工作原理,但是我之前做过一些测试,发现使用f:view transient="true"会产生影响。对于MyFaces,算法被设计成状态保存非常快速,因此将整个视图标记为无状态与否没有区别。相反,从性能角度来看,MyFaces中可用的EL缓存、HTML空间压缩和其他改进更加有效。尝试使用MyFaces 2.2.4,您会看到巨大的性能提升,这正是您所期望的。 - lu4242
看一下这篇文章,它可以帮助你进行压力测试:理解JSF 2.0性能-第3部分。如果您想查看代码,可以在Github上找到。 - lu4242
1个回答

0

根据Balusc在链接中所说的,将瞬态应用于视图标记将使整个视图(即页面)无状态,这是有道理的,因为将瞬态设置为true会调用UIViewRoot对象上的setTransient()。您当前的设置无法实现此目标。我不确定是否有任何方法或变通方法来实现具有多个状态的单个页面。


如果编写自定义组件,就可以完成此操作,但关键是是否真正有优势。这取决于JSF实现和版本。 - lu4242
这并不完全正确,至少对于Myfaces 2.3来说不是。从Myfaces 2.2升级后,瞬态视图停止工作,引发“无法创建视图”的异常。这让我疯狂了几个小时,所以如果有帮助的话: 在myfaces 2.3中,模板的瞬态属性似乎不能被正确地继承到最终页面。在页面恢复时,瞬态属性显示为false。解决方法是在最终页面上也设置transient="true"。另一个选项是在最终页面上使用块<f:metadata><f:view transient="true" /></f:metadata>(f:metadata文档说它不应该在模板中使用)。 - Aníbal
为了以后的参考,我们在MyFaces 2.2.13和2.3.3中修复了上面评论中提到的瞬态属性模板/继承问题:https://issues.apache.org/jira/browse/MYFACES-4267 - wtlucy

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