2017-03-04 63 views
1

我搜索了多种方式和解决方案,使春天hibrenate到一个安全的线程。我是春天和h little的小初学者,我无法做出这个决定。使Spring Hibernate线程安全。 Best solation

我发现这些选项:

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

  2. 只需在一个线程中运行所有事务(至少所有更新),此线程将是“ExecuterThred”,他使共享所有这些交易将按顺序执行。这样就没有机会了transactoin冲突,但这种方法要依据一个线程你DATABSE春天的服务器,它可以通过useig regular java thread,也许大在实现一个 like this,或使用thread local

  3. 让道同步(或免得所有的更新方法),也没有机会进行交易冲突,但可以拖动服务器。

更多一点,在我的服务器,任何客户端都有用户,并且任何用户都有唯一的ID。我认为关于更多一个选项:使任何客户端能够在同一时间只发送一个请求(使数据库不同)的共享。 (我现在可以,因为我可以使用唯一的ID),如果客户端这样做anywey我会回应与并发错误,他可以尝试再次信。 这将是选项4

如果你有更多的选项plaese让我知道。

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

+0

不知道为什么你需要担心这一点。您应该在服务器上使用某种连接池来开始。这已经有多个线程池。 – OldProgrammer

+0

感谢您的回复。我需要一些工作。我使用mysql和一些时间,我想做一些大的长查询和更多的查询和'冲突'发生,通常与一些sql exeption。一些动作我acuatlly也许会出现两个不同势交易 –

+0

请出示一些相关的代码和错误。 – OldProgrammer

回答

1

什么增益会净为使用Hibernate和Spring大多数应用程序?

我猜测,设计实际上是一个净亏损对于大多数应用程序,因为你描述的场景真的是越来越一角情况下其现有的锁定策略和集成与其他技术堆栈可以很容易地减轻这些问题。

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

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

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

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

老实说,我认为你要过工程师的东西那里已经尝试和验证的解决方案来处理正是你有顾虑。绝对是否有努力去做正确的事情。但是没有复杂的解决方案只是几行代码:P。