当我点击一个链接时,会打开一个窗口弹出窗口。我正在使用一个会话管理的bean来加载java.util.List.It需要几秒钟来加载该列表。
当我点击链接两次时,我得到并发修改异常。因为页面处于会话模式,第一个请求仍在加载List,在结束之前第二个请求尝试更新列表。
我手头有两种可能的解决方案
1)引入同步块
问题:引入同步块会导致多线程环境中的性能问题?
2)javascript在点击后禁用链接。
问题:不是一个好的选择,因为我们需要在加载弹出窗口后恢复javascript的状态。如果弹出窗口异常终止,则链接有可能永远被禁用。
这个问题还有其他解决办法吗?
答案 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链接。