Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF多并发客户端_Jsf_Primefaces_Concurrency_Datatable - Fatal编程技术网

JSF多并发客户端

JSF多并发客户端,jsf,primefaces,concurrency,datatable,Jsf,Primefaces,Concurrency,Datatable,我有一个Primefaces 6+Spring 3集成的web应用程序,它有一个简单的单元格可编辑Primefaces datatable,绑定到一个(Spring)会话范围的支持bean,该bean从SQL查询填充datatable模型对象,这是非常标准的东西。单元格编辑触发更新数据库的ajax调用。它在单用户环境下运行良好,并通过了我的所有单用户系统测试 在部署到生产环境后,我发现当多个用户打开应用程序时,单元格编辑会完全失控。有时,编辑使其返回到数据库,但UI中的单元格会返回到未编辑的值。

我有一个Primefaces 6+Spring 3集成的web应用程序,它有一个简单的单元格可编辑Primefaces datatable,绑定到一个(Spring)会话范围的支持bean,该bean从SQL查询填充datatable模型对象,这是非常标准的东西。单元格编辑触发更新数据库的ajax调用。它在单用户环境下运行良好,并通过了我的所有单用户系统测试

在部署到生产环境后,我发现当多个用户打开应用程序时,单元格编辑会完全失控。有时,编辑使其返回到数据库,但UI中的单元格会返回到未编辑的值。有时,即使页面未刷新,新值也会显示在错误的显示行中

我隐约意识到,当user2进行编辑时,user1的支持bean中的模型对象变脏了,因此,当user1随后进行编辑时,事情可能会出错,但即使user1根本没有进行编辑,失败也会发生。我没有实现在编辑后将数据从服务器推送到客户端以保持客户端同步的机制

datatable中的每一行都对应于一个不同的对象,该对象具有来自数据库中相应列的(隐藏)ID。正因为如此,我明显的错误想法是,无论显示的数据有多陈旧,SQL更新都会应用于正确的数据库行,但事实并非如此

查询没有“order by”,代码也不会对结果进行排序,因此我认为不同的HTTP请求和后续查询执行可能会以不同的顺序返回行,但我验证了它们没有

我认为也许将支持bean的范围限定到应用程序范围可以解决这个问题,但这并不能解决user2进行编辑后user1显示的表不同步的问题


这似乎是一个根本性的问题,有一个简单的解决方案,我根本不知道。这是Ajax严格禁止的情况吗?

刚刚发现(为时已晚)解决了同样的情况,对我来说没有解决方案。我将Spring与JSF结合使用,因此ViewScope不可用,但显然这不是一个解决方案。我已经能够在编辑后更新整行,因此编辑器可以在其他列中看到其他人进行的任何并发编辑,但这并不能解决行无序的问题。您好@snakedog,欢迎使用so;)。我认为你应该尝试加入一些新的元素来解决这个问题。几秒钟后刷新登录用户的表,或者使用套接字通知浏览器,然后刷新显示的记录。此外,还可以在数据库记录中包含版本控制,这样可以确保没有人会更新未同步的值。最后,但同样重要的是,让您的用户始终了解加载和持久化的实际数据的实时反馈,从而防止任何不必要的输入被持久化。感谢您的热烈欢迎,@Bonifacio。这些都是很好的建议,我很感激。在我的例子中,正在编辑的记录只有4个小字符串,因此在ajax提交时将当前显示的数据与另一个查询的结果进行比较并不繁重。出于这个原因,我也选择不合并推送通知的复杂性,尽管这是一个更加健壮的解决方案。最后,这是一个很少使用的管理应用程序,因此让用户体验到更罕见的必须重新输入数据的体验是有意义的。但总的来说,你的建议是我认为最好的做法。只是发现(为时已晚)解决了同样的情况,对我来说没有解决办法。我将Spring与JSF结合使用,因此ViewScope不可用,但显然这不是一个解决方案。我已经能够在编辑后更新整行,因此编辑器可以在其他列中看到其他人进行的任何并发编辑,但这并不能解决行无序的问题。您好@snakedog,欢迎使用so;)。我认为你应该尝试加入一些新的元素来解决这个问题。几秒钟后刷新登录用户的表,或者使用套接字通知浏览器,然后刷新显示的记录。此外,还可以在数据库记录中包含版本控制,这样可以确保没有人会更新未同步的值。最后,但同样重要的是,让您的用户始终了解加载和持久化的实际数据的实时反馈,从而防止任何不必要的输入被持久化。感谢您的热烈欢迎,@Bonifacio。这些都是很好的建议,我很感激。在我的例子中,正在编辑的记录只有4个小字符串,因此在ajax提交时将当前显示的数据与另一个查询的结果进行比较并不繁重。出于这个原因,我也选择不合并推送通知的复杂性,尽管这是一个更加健壮的解决方案。最后,这是一个很少使用的管理应用程序,因此让用户体验到更罕见的必须重新输入数据的体验是有意义的。但总的来说,我认为你的建议是最好的做法。