2009-11-19 72 views
1

Oracle 10g中的觸發器生成upsert和刪除常規表中行子集的消息。這些消息由兩個字段組成:Oracle AQ出列訂單

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

當消費這些消息我想在雙端隊列過程尊重以下約束強加的順序:

  • 郵件必須按插入順序出隊。
  • 屬於同一個ID的消息必須以這樣一種方式出隊,以至於其他出隊過程不應該能夠使用該ID出隊潛在的後繼消息(或消息)。由於消息是使用觸發器生成的,因此我無法爲此使用組。

我正在爲AQ使用Oracle Java接口。任何關於如何實現的指針?

回答

2

我相信默認的出隊順序是先進先出,因此他們將按照排隊順序排隊。

對於你的第二點,你是說你想序列化非唯一ID出列?也就是說,您的隊列中基本上有許多隊列,並且您只需要一個作業在任何時候在每個隊列中使用消息?

也就是說,你擁有的消息:

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

這裏有兩種類型的記錄(A和B),並且要1個作業消耗所有A和另一消耗所有B的。如果是這種情況,考慮創建多個隊列?

失敗多個隊列,請查看您傳遞給出隊過程的dequeue_options_t類型 - 最值得注意的是dequeue_condition - 這允許您只選擇特定消息,因此您可以爲所有a和另一個全部開始一項工作B的等等。

+0

N隊列不是一個選項(有很多,許多不同的ID與壽命相對較短)。出隊選項方法的問題是,我需要對將來不在隊列中的消息(具有相同的ID)進行某種鎖定。否則,另一個消費者C2可能在消費者C1完成消費1之前消費消息2(都是'a'型消息)。 ATM我認爲這個問題可以通過NOWAIT(timeout => 0)用戶鎖解決,但我不相信在AQ中沒有「native」解決方案。 – yawn 2009-11-20 23:37:26