繁体   English   中英

检测对 java object 的并发访问

[英]Detect concurrent access to a java object

我对 java 中的并发访问有疑问。

项目上下文如下:JSF 2.1; Richfaces 4,hibernate 3.6,spring 3.2,java 7。

我有一个表格,显示了数十万个文件夹(每个文件夹是一个 java 对象),每个表格行都是访问对象(文件夹)的咨询或修改的动态链接。

我的问题是:如何防止多个用户查看或编辑一个文件夹?

换句话说,您如何检测多个用户同时访问文件夹(对象 java)?

我知道使用方法同步这个词可以防止并发访问,但我想检测并发访问以警告其他用户或其他用户文件夹(对象 java)已经打开,我们必须等待它关闭。

谢谢

同步和所有其他锁定/阻塞方法只会阻止代码内的并发访问。

它不会阻止 2 个用户同时编辑同一个“事物”。 这是您必须自己放入代码中的内容。

有两种最常见的方法可以实现这一点:

  • 乐观锁定:您假设即使多个用户查看同一个项目,也不会同时有多个更改。 因此,您仅在 SAVING 期间检查是否有并发修改。 要实现这一点:
    • 问题中的 Object 需要一个时间戳,即上次修改的时间。 (任何人)
    • 用户打开要查看的项目后,您将该时间戳存储在 session 上下文中。
    • 如果用户单击“保存”,则将 session-context-timestamp 与实际 object 的时间戳进行比较。 如果它们相同,则可以保存更改。 如果 Object 在两者之间进行了修改,则需要显示一个错误,即它已被修改,并且如果不预先加载新的基值,则无法保存更改。
  • 悲观锁定:您假设,每当用户查看 Object 时,都会发生变化。 要实现这一点:
    • 问题中的 Object 需要一个 Int-Flag,它当前正在被编辑(任何人 - 标志 = 用户 ID)
    • 一旦第二个用户尝试加载该 object,您否认因为有人正在编辑。
    • 这里棘手的部分是清理“锁”,如果编辑用户只是退出页面而没有通过应用程序方法“中止”。 要处理这个问题,您需要定义一个 Lock-Timestamp,定义一些超时值(例如 30 分钟)并再做两次检查:
      • 编辑用户在保存时超过了超时值? 他不能再保存了。 (作为额外的,您可以允许以后保存,如果 object 没有被其他人锁定,请使用 lock-user-id 来确定)
      • Object 已锁定,但锁定时间超过 30 分钟? 第二个用户可以再次打开,并为自己声明 lock-user-id。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM