【问题标题】:Make Spring Hibernate thread safe. Best solation使 Spring Hibernate 线程安全。最好的解决方案
【发布时间】:2017-07-24 19:53:50
【问题描述】:

我搜索了多种方法和解决方案,以使 spring 休眠到安全线程。我是 spring 和 hibrenate 的小初学者,我无法独自做出这个决定。

我找到了这些选项:

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

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

  3. 使dao同步(或至少更新方法),也不会有transactoin冲突的机会,但可以跟踪服务器。

更多的东西,在我的服务器中,任何客户端都有用户,任何用户都有唯一的 id。我想到了更多一个选项:共享任何客户端都只能同时发送一个请求(在数据库上产生不同的请求)。 (我现在可以这样做,因为我可以使用唯一的 id),如果客户这样做,无论如何我会以并发错误响应,他可以再试一次。 这将是选项 4

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

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

【问题讨论】:

  • 不知道为什么你需要担心这个。您应该首先在服务器上使用某种连接池。那已经有多个线程池了。
  • 感谢您的回复。我需要做一些工作。我使用 mysql,有时我想做一些大的长查询和更多的查询,然后发生“冲突”,通常有一些 sql exeption。我的一些行动可能是两个不同的交易
  • 请显示一些相关代码和错误。

标签: java spring multithreading hibernate server


【解决方案1】:

对于大多数使用 Hibernate 和 Spring 的应用程序来说,这会带来什么好处?

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

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

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

那绝对是额外的代码。但它是特定于用例和业务案例的额外代码。在某些情况下,我想快速失败。在其他情况下,我可能想重试,而在其他情况下,我可能只是让最后更改它的人获胜。

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

老实说,我认为您正在尝试过度设计一些已经有经过验证的解决方案来准确处理您所担心的问题的东西。是否有努力做对,绝对。但也没有任何复杂的解决方案只是几行代码:P。

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    相关资源
    最近更新 更多