我正在尝试创建一个为不同组织提供IT服务的应用程序。
我有一个很长的表单来创建用户,我必须通过LDAP搜索该组织内的所有用户。这结果是一个耗时的过程。我可以搜索所有用户,然后将它们放入列表中,并在不同的情况下使用该列表。但问题是,任何管理员都可以同时修改或删除用户。我曾想过将列表放入应用程序范围的bean中。但我也有一个不同的组织,它拥有完全不同的用户组。
在这种情况下,适当的解决方案是什么?
答案 0 :(得分:1)
如果您运行的JSF应用程序的多个实例都访问单个数据库,我会说这不是范围可以处理的事情。
这应该通过锁定数据库中的对象来处理,即当您为用户加载编辑视图时,用户对象被锁定以便编辑其他对象(例如名为 locked的布尔列)。保存或取消编辑,释放锁定(如果用户忘记执行任何操作,则会过期)。
答案 1 :(得分:0)
应用程序作用域数据对应用程序的所有用户可见。也就是说,如果您将一些列表放在应用程序范围中,稍后在视图中引用它,那么对于每个用户来说它都是相同的实例。此外,您应该注意这种方法带来的严重并发问题。
最有可能的是,当您将用户列表放在会话范围内时,确定范围问题将会结束。当具有适当权限的用户在某些视图中要求时,您将加载特定组织的用户列表。
从这一点开始,您将面临您担心的实际问题,以及在多用户环境中同时访问共享资源时出现的问题(例如管理员在您的示例中修改用户) 。您可能会从您的问题中得到的一件事就是“最后提交获胜”策略,在该策略下,在最后一个用户提交编辑之前由其他用户及时进行的编辑将丢失,或者被最后一次提交覆盖。
这种类型的问题可以通过在数据库级别引入某种类型的“锁定”来解决。基本上有两种类型的锁定:乐观和悲观。
在另一个答案中提出的是悲观锁定的示例,在该示例下,除非释放数据库锁,否则不允许任何人访问数据。 seip如下:要更新数据的用户放置一个独占锁,防止其他用户操纵数据,直到锁被释放。背后的想法是用户将同步更新数据库资源,无论这些冲突更新实际发生的频率如何,都必须排除这种可能性。
另一个选项 - 乐观锁定假设许多用户可以同时访问和修改数据,而无需锁定数据库资源。这通常通过将记录版本存储在数据库中来实现。发生冲突时,可以提示用户,防止信息丢失。背后的想法是,尽管可能存在冲突的更新,但事实上它们很少见,并且无论如何都会通知用户该冲突。
请注意,当最终用户总是选择覆盖数据时,没有锁定的设置或“最后提交获胜”策略与乐观锁定基本相同。
如您所见,有一些方法可供选择。所以首先要自己了解它们,然后也许你的不那么喜欢的问题就会消失。如果没有 - 你将能够回来并针对具体问题发布具体主题的新问题,这样我们就不会推测,而是集中精力帮助你。