- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
一段时间以来,我一直在研究如何解决这个问题,但似乎找不到合适的解决方案。
问题是:
我有一个 Java EE 应用程序,许多用户可以在其中登录,他们会看到一个项目列表,他们可以选择和编辑其中的任何一个。
所有用户看到相同的项目列表。如前所述,他们可以编辑项目,但我想将编辑功能限制为一个用户。也就是说,许多用户可以同时编辑不同的项目,但只有一个用户可以编辑特定项目。
当一个用户正在编辑一个项目时,应该向任何其他试图编辑该项目的用户显示一条消息。
我通过在项目上设置一个标志 inUse 为 true 来实现这一点,然后检查它。当用户通过单击保存或取消完成对项目的编辑时,该标志将设置为 false。这种方法的问题是要考虑用户打开浏览器或关闭浏览器的情况。
我尝试设置 session 超时,但似乎无法正常工作,因为当 session 超时时,我无法访问该项目。我只能访问 httprequest session ID。
也许这是错误的方法,因为它似乎是许多应用程序都会遇到的问题,应该存在一个不那么骇人听闻的解决方案。
我研究过使用线程和同步方法,但不知道它是如何工作的,因为一旦用户进入编辑项目屏幕,该方法就会退出并释放锁。
我找到了这个解决方案 Only one user allowed to edit content at a time但不确定这是否是使用 Java 的方式。
是否有更优雅/java 的解决方案?如果是这样,你能指出我正确的方向吗?您将如何实现?
谢谢!
解决方法:虽然最初我认为乐观锁定是可行的方法,但我很快意识到它并不适合我的环境。我决定结合使用悲观锁定 (http://www.agiledata.org/essays/concurrencyControl.html#PessimisticLocking) 和超时。
当访问一个项目时,我将一个 inUse 字段设置为 true,并将该对象的上次访问字段设置为当前时间。
每当有人试图编辑对象时,我都会检查 inUse 字段和 lastAccessed 字段 + 5 分钟。所以基本上,我给 5 分钟来编辑用户。
最佳答案
像在数据库中那样做,使用时间戳。时间戳与记录一起保存,当一个人提交他的编辑时,除非时间戳相同,否则编辑不会通过(意思是“自从我阅读此记录以来没有发生任何编辑”)。然后当编辑完成时,会创建一个新的时间戳。
关于java - 并发 : Only one user editing an item at a time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8954442/
我是一名优秀的程序员,十分优秀!