使Spring Hibernate线程安全。最好的消息

时间:2017-03-04 19:24:00

标签: java spring multithreading hibernate server

我搜索了多种方法和解决方案,使春天变得安全。我很少有春天和hibrenate初学者,我不能做出这个决定。

我找到了这些选项:

  1. 使用hibrenate locking“破坏”与其他事务发生冲突的任何事务,并从错误的数据中保存数据库。这有一个缺点,因为只是没有执行的交易,以及完成这些请求会更复杂的工作

  2. 只需在一个线程中运行所有事务(至少所有更新),该线程将是“ExecuterThred”并且他将共享所有这些事务将按顺序执行。通过这种方式,没有机会进行transactoin冲突,但是这个解决方案使你的数据库弹簧服务器依赖于一个线程,它可以通过useig regular java thread实现,也许是大的 like this,或使用thread local

  3. 让dao同步(或至少所有更新方法),也不会发生transactoin冲突,但可以追踪服务器。

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

    如果您有更多选择,请告诉我。

    非常感谢,欢迎任何帮助或解释

1 个答案:

答案 0 :(得分:1)

对于大多数使用Hibernate和Spring的应用程序,这个网络会有什么收获?

我猜测大多数应用程序的设计实际上都是净损失,因为您描述的场景实际上更像是一个现有锁定策略和与其他技术堆栈集成的极端情况缓解这些问题。

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

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

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

如果必须序列化更新,您可以考虑使用JMS队列等代理解决方案,或者将更新操作发布到单个处理程序中并执行。这允许您根据需要扩展应用程序,并避免在应用程序中嵌入后台线程。但这确实意味着您的应用程序必须处理最终一致性,因为如果该队列有积压,则该更新可能需要几秒或几分钟才能反映在您的应用程序中。如果您正在使用二级缓存(2LC),也要了解其含义。

老实说,我认为你正试图过度设计一些已经经过验证的解决方案来解决你所关心的问题。绝对是努力做得对吗?但是,任何复杂的解决方案都不会只是几行代码:P。