JSF并发问题

时间:2009-08-31 08:31:28

标签: jsf concurrency synchronization

当我点击一个链接时,会打开一个窗口弹出窗口。我正在使用一个会话管理的bean来加载java.util.List.It需要几秒钟来加载该列表。

当我点击链接两次时,我得到并发修改异常。因为页面处于会话模式,第一个请求仍在加载List,在结束之前第二个请求尝试更新列表。

我手头有两种可能的解决方案

1)引入同步块

问题:引入同步块会导致多线程环境中的性能问题?

2)javascript在点击后禁用链接。

问题:不是一个好的选择,因为我们需要在加载弹出窗口后恢复javascript的状态。如果弹出窗口异常终止,则链接有可能永远被禁用。

这个问题还有其他解决办法吗?

4 个答案:

答案 0 :(得分:2)

我会选择选项1.同步会话中的某些内容或会话bean本身。在单一服务器环境中,这应该是非常安全的,但在不使用粘性会话的群集中,您将不得不寻找更好的单例。

不应该影响性能,因为您将为该特定会话bean的每个用户会话进行同步,如果没有争用,则不值得考虑这个成本。

答案 1 :(得分:1)

另一种解决方案是使POPUP窗口模态窗口意味着父窗口将 被模糊/黯然失色,直到弹出关闭。 搜索JavaScript代码。

答案 2 :(得分:0)

选择第二个选项。

答案 3 :(得分:0)

如果您使用的是富脸,您可以使用a4j富脸库并重新呈现弹出链接

<a4j:commandButton id="popupLinkId" onlick="window.open("popupLink");return false;"  reRender="popupLinkId" />

这里a4j是jsf富脸库的ajax。有关详细信息,请参阅http://livedemo.exadel.com/richfaces-demo/richfaces/support.jsf;jsessionid=B9DFBAF3AFD62C96B94EEC67FC4645A5?c=support&tab=usage链接。