使弹簧冬眠线安全.最佳解决方案



我搜索了多种方法和解决方案,以使弹簧hibrenate成为安全线程。我小的春天和hibrenate都是初学者,我只是无法做出这个决定。

我找到了以下选项:

  1. 使用Hibrenate锁定来"破坏"与其他交易发生冲突的任何交易,并将数据库从错误的数据中保存。这有缺点,因为交易将是没有执行的交易,并且将完成更复杂的工作以完成Thouses请求

  2. 只需在一个线程中运行所有事务(以免所有更新),此线程将是"执行者",他使共享所有这些交易将以串行顺序执行。这样,transactoin冲突就没有机会,但是此解决方案使您的数据弹簧服务器取决于一个线程,它可以通过useig常规Java线程实现,也许是大一个线程像这样,或使用线程本地

  3. 使DAO同步(或以所有更新方法)也不是Transactoin Clash的机会,但可以使用服务器。

更多的东西,在我的服务器中,任何客户端都有用户,并且任何用户都具有唯一的ID。我想到了更多一个选项:分享任何客户都可以同时发送一个请求(在数据库上有不同的请求)。(我现在可以这样做,因为我可以使用唯一的ID),如果客户端执行此操作,我会同时发生错误,他可以再次尝试字母。这将是选项4

如果您有更多选项Plaese让我知道。

非常感谢,任何帮助或解释都将受到欢迎

对于大多数使用Hibernate和Spring的应用程序,该网络将获得什么收益?

我会推测,对于大多数应用程序,设计实际上将是净损失,因为您描述的场景实际上是一个拐角处的情况,现有的锁定策略和与其他技术堆栈的集成可以轻松轻松减轻这些问题。

您应该始终首先尝试使用乐观的锁定

过去,我使用了一个解决方案,在该解决方案中,我维护了我用作数据库开始操作时数据库所具有的快照的缓存副本。当用户帖子更改回服务器时,我会修改该实体的第二个实例,然后尝试保存该实体。每当Hibernate失败而乐观的锁定异常时,我都可以将返回的数据库快照与原始缓存副本进行比较,并决定是否可以重试操作,请断言是否不能重试或重试尝试。

绝对是额外的代码。但这是特定于用例和业务案例的额外代码。在某些情况下,我想快速失败。在另外,我可能想重试,而在其他人中,我可能只允许最后一次更改它的人赢得胜利。

如果必须序列化更新,则可以考虑使用诸如JMS队列或将更新操作以单个处理程序中的更新操作和执行的代理解决方案。这使您可以根据需要扩展应用程序,并避免在应用程序中嵌入背景线程。但这确实意味着您的应用程序必须处理最终的一致性,因为如果该队列具有积压,则该更新可能需要几秒钟或几分钟的时间来反映您的应用程序。还要了解您使用第二级缓存(2LC)的含义。

老实说,我认为您正在尝试过度工程,但在已经有尝试和证实的解决方案来处理您的担忧。绝对做正确的事情。但是,也没有复杂的解决方案只是几行代码:p。

最新更新