0

我正在尝试创建一个为不同组织提供 IT 服务的应用程序。

我有一个用于创建用户的长表单,我必须通过 LDAP 搜索该组织内的所有用户。事实证明,这是一个耗时的过程。我可以搜索所有用户,然后将它们放入一个列表中,然后在不同的情况下使用该列表。但问题是任何管理员都可以同时修改或删除用户。我曾想过将列表放入应用程序范围的 bean 中。但我也有一个不同的组织,它有完全不同的用户集。

在这种情况下,合适的解决方案是什么?

4

2 回答 2

1

如果您正在运行一个 JSF 应用程序的多个实例,并且所有实例都访问一个数据库,那么我会说这不是范围可以处理的事情。

这应该通过锁定数据库中的对象来处理,即当您为用户加载编辑视图时,该用户对象被锁定以便对其他人进行编辑(如名为locked的布尔列)。保存或取消编辑,释放锁定(或者如果用户忘记执行任何操作,它就会过期)。

于 2013-04-09T14:51:27.970 回答
0

应用程序范围内的数据对应用程序的所有用户可见。也就是说,如果您将一些列表放在应用程序范围内,然后在视图中引用它,那么对于每个用户来说,它将是同一个实例。此外,您应该注意这种方法带来的严重并发问题。

最有可能的是,当您将用户列表置于会话范围内时,您的范围界定问题将结束,它最自然地适合。当具有适当权限的用户在某些视图中需要它时,您将加载特定组织的用户列表。

从这一点开始,您将面临您担心的实际问题,这些问题是在同时访问共享资源的多用户环境中出现的问题(例如在您的示例中管理员修改用户)。您害怕的一件事(可以从您的问题中得出)是“最后提交获胜”策略,根据该策略,在最后一个用户提交编辑之前其他用户及时进行的编辑将丢失,或者被最后一次提交覆盖。

这类问题可以通过在数据库级别引入某种类型的“锁定”来解决。基本上有两种类型的锁定:乐观和悲观。

在另一个答案中提出的是一个悲观锁定的例子,在这种情况下,除非释放数据库锁,否则不允许任何人访问数据。seip如下:要更新数据的用户放置一个排他锁,防止其他用户操作数据,直到锁被释放。背后的想法是用户将同步更新数据库资源,无论这些冲突更新实际发生的频率如何,都必须排除这种可能性。

另一种选择 -乐观锁定假设许多用户可以同时访问和修改数据,而不会锁定数据库资源。这通常通过在数据库中存储记录版本来实现。当发生冲突时,可以提示用户,防止信息丢失。背后的想法是,尽管可能存在冲突更新,但实际上它们很少见,并且在任何情况下都会通知用户该冲突。

请注意,当最终用户总是选择覆盖数据时,没有锁定的设置或“最后一次提交获胜”策略与乐观锁定基本相同。

如您所见,有一些方法可供选择。所以首先自己了解它们,然后也许你不太喜欢的问题就会消失。如果没有 - 您将能够回来并发布一个关于具体问题的具体主题的新问题,这样我们就不会推测,而是专注于帮助您。

于 2013-04-09T18:14:18.480 回答