gpt4 book ai didi

java - 数据库中的队列管理

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:31 24 4
gpt4 key购买 nike

首先,我正在寻找解决此问题的不同方法。

我在我们的应用程序中有一个队列,它在数据库表中维护。有一个预定的处理器将查看队列并根据记录上的 STATUS 字段提取记录。它处理这些记录,并在成功时从表中删除记录。

问题是我的应用程序是集群的。因此,将有多个计划处理器实例提取相同的记录,然后处理它们...

为了解决这个问题,我采用的方法是我在处理记录之前更新了记录的状态(比如从 PENDING 到 WORKING),并且还在表的实体映射上添加了一个版本,因此操作顺序将是

1) 查询表中的 PENDING 记录。2) 将状态更新为 WORKING。 (如果处理器的另一个实例在有人已经更新记录时尝试更新它,它将给出一个异常,因此将移动到下一条记录)3) 关于成功。删除记录,否则将其更新回 PENDING。

现在,这样做可以很好地解决问题,但不太喜欢这个想法...

想知道遇到类似问题的人是如何解决的。

我有另一种方法来解决这个问题,因为同一个应用程序填充了表,将它分配给填充它的主机,并且该特定 tomcat 上的调度处理器仅查找该主机的记录。基本上是尽量减少第一个解决方案将继续发生的颠簸。

它是一个 Spring 3.0.5 和 Hibernate 应用程序

最佳答案

这是一个很常见的问题。您可以通过不同的方式解决它:

  • 通过分配新状态+乐观锁定来拥有当前处理的记录。这是您的方法,它会起作用,但您必须记住,如果当前正在处理某个节点的节点死亡,请清理表。

  • 与上面相同,但使用悲观锁定 - 如果有很多节点并且经常发生乐观锁定失败,则可能是更好的方法

  • 外部/全局锁定 - 一次只有一个节点可以访问整个队列表。您可以使用表级锁定来阻止所有其他节点或部分节点。

  • 在队列表中放置新记录时,将其随机分配给给定节点,以便其他节点无法处理它。不要走这条路,维护噩梦,例如添加或删除节点时。

  • 使用 ,它会自动集群作业并在一个节点上运行它们。它使用类似于上面的技术(共享数据库上的悲观锁定)

  • ...或者只是使用普通的 JMS 提供程序,数据库并不是真的要用作队列...

关于java - 数据库中的队列管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9593980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com