2017-02-16 41 views
0

让我们假设我们有一个应用程序“邮件客户端”和一个前端。用hibernate的乐观/悲观锁定并发的好策略/解决方案

如果用户正在输入消息或编辑主题或其他内容,则会进行一次休息调用以更新用户正在更改的任何内容(例如接收者)以将消息保留在DRAFT中。所以很多PUT正在发生以保存消息。关闭窗口时,每个可编辑字段的更新同时发生。 Hibernate无法处理这种并发性:这些调用中的每一个都检索消息,编辑它们自己的字段并尝试再次保存消息,而另一个调用已经改变它。

我知道我可以添加一个休息电话来同时保存所有的字段,但我想知道是否有一个更清洁的解决方案,或者一个体面的策略来处理这种情况(例如只更新一个字段或一些合并策略如果对象已经改变)

在此先感谢!

+0

https://www.google.com/search?q=hibernate+update+single+column&ie=utf-8&oe=utf-8#q=hibernate+update+single+field – ZhongYu

回答

0

最简单的解决方案,这里将是调整的UI要么

  • 提交电子邮件提交,做必要的所有任务中一个REST调用。
  • 序列化其余的调用,以便它们被链接而不是同时触发。

的关注,我这里的是,这会在某个时刻雪球多的用户与应用程序交互成为一个更大的并发问题。考虑一下当您面对100,500,1000或甚至10000或以上的并发用户时,您的Web基础架构必须单独支持的并发休息呼叫的潜在数量。

当负载本身首先是设计缺陷的产物时,是否真的有意义增强服务器的容量来处理负载?

Hibernate旨在通过两种机制处理锁定,乐观和悲观。

乐观的方式

  1. 阅读从数据存储实体。
  2. 缓存您要在临时变量中修改的字段的副本。
  3. 根据您的PUT操作修改该字段或字段。
  4. 尝试合并更改。
  5. 如果保存成功,就完成了。
  6. 如果出现OptimisticLockException,请从数据存储刷新实体状态。
  7. 将缓存的值与必须更改的字段进行比较。
  8. 如果值不同,则可以断言或者抛出一个异常
  9. 如果他们没有什么不同,回去4.

乐观方式的美丽的部分是你避免任何形式的发生死锁,特别是如果你允许单独读取和锁定多个表。

虽然您可以使用悲观锁定选项,但乐观锁定通常是处理并发操作的最佳接受方式,因为它具有最少的并发争用和性能影响。

+0

现在,我链接了电话(快速修复)。但是正如你所指出的那样,一旦应用程序扩展,这是非常有问题的。我希望每次字段更改时都不要与所有字段进行一次通话。我正在考虑在hibernate中使用单个更新语句...这样,不需要检索对象 - >为这些调用解决并发问题...虽然我想知道对完整应用程序会产生什么样的影响,因为它不仅仅是一个简单的邮件客户端,而且是一个完全成熟的商业解决方案,用于加密消息传递,它使用obj的 –

+0

进行了大量预定的后处理。我更新了我的答案以包含使用乐观锁定的想法。您当然可以激发纯粹的UPDATE语句,但是这并不能解决某些其他进程修改用户尝试修改的字段会发生什么的问题。你的纯粹的'UPDATE'方法接受了最后一个胜利的概念,而不是强迫非优先审查他们的变化,如果发生冲突。 – Naros