【问题标题】:Oracle AQ dequeue orderOracle AQ 出队顺序
【发布时间】:2010-03-27 09:00:03
【问题描述】:

Oracle 10g 中的触发器为常规表中的行子集生成更新插入和删除消息。这些消息由两个字段组成:

  • 唯一的行 ID。
  • 非唯一 ID。

在使用这些消息时,我想对双端队列进程施加一个遵守以下约束的顺序:

  • 消息必须按插入顺序出队。
  • 属于同一 ID 的消息必须以这样的方式出队,即任何其他出队进程都不能将具有此 ID 的潜在后续消息(或多个消息)出队。由于消息是使用触发器生成的,因此我不能为此目的使用组。

我正在为 AQ 使用 Oracle Java 接口。关于如何实现这一点的任何指示?

【问题讨论】:

    标签: java oracle advanced-queuing


    【解决方案1】:

    我认为默认的出队顺序是先进先出,因此它们将按照与入队相同的顺序出队。

    对于第二点,您是说要在非唯一 ID 上序列化出队吗?即,您的队列中基本上有许多队列,并且您只希望一个作业在任何时候消费来自每个队列的消息?

    也就是说,你有消息:

    1 | a
    2 | a
    3 | b
    4 | a
    

    这里您有两种类型的记录(a 和 b),您希望 1 个作业消耗所有 a,另一个作业消耗所有 b。如果是这种情况,是否考虑创建多个队列?

    如果多个队列失败,请查看传递给 dequeue 过程的 dequeue_options_t 类型 - 最值得注意的是 dequeue_condition - 这允许您仅选择特定消息,因此您可以为所有 a 启动一个作业,为所有 a 启动另一个作业b等。

    【讨论】:

    • N 个队列不是一个选项(有很多很多不同的 id,生命周期相对较短)。 dequeue 选项方法的问题是我需要对尚未在队列中的未来消息(具有相同的 id)进行某种锁定。否则,另一个消费者 C2 可以在消费者 C1 完成消费 1 之前消费消息 2(都是“a”型消息)。 ATM 我认为这个问题可以通过 NOWAIT (timeout => 0) 用户锁来解决,但我不相信 AQ 中没有“本机”解决方案。
    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2023-03-25
    • 1970-01-01
    • 2011-05-14
    • 2017-03-25
    相关资源
    最近更新 更多