2009-11-19 1 views
1

Oracle 10g의 트리거는 일반 테이블의 행 서브 세트에 대한 upsert 및 delete 메시지를 생성합니다. 이 메시지는 두 개의 필드로 구성됩니다.Oracle AQ dequeue order

  • 고유 한 행 ID입니다.
  • 고유하지 않은 ID입니다.

나는 다음과 같은 제약을 존중 양단 큐 과정에 주문을 부과하려는 이러한 메시지 소모 :

  • 메시지가 삽입 순서대로 대기열에서 제거되어야합니다.
  • 동일한 ID에 속하는 메시지는 다른 대기열에없는 프로세스가이 ID를 사용하여 잠재적 후계자 메시지를 큐에서 제거 할 수 없도록 대기열에서 제거되어야합니다. 메시지는 트리거를 사용하여 생성되므로이 용도로 그룹을 사용할 수 없습니다.

AQ 용 Oracle Java 인터페이스를 사용하고 있습니다. 어떻게 달성 할 수 있었는지에 대한 조언이 있습니까?

답변

2

기본 큐 제거 순서는 처음부터 먼저 수행되므로 대기열에 있던 순서대로 큐에서 제거됩니다.

두 번째 요점은 비 고유 ID에서 대기열에서 삭제를 직렬화하겠다고 말하는 것입니까? 즉, 기본적으로 대기열에 많은 대기열이 있으며 한 번에 하나의 작업 만 각 대기열에서 메시지를 소비하게해야합니까? 여기

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

당신이 기록의 두 가지 유형이 (A와 B) 및 1 일 모든 A의 다른 모든 ㄱ의를 소비하는 소비 할 :

즉, 당신은 메시지를 가지고있다. 그렇다면 다중 대기열을 만드는 것이 좋습니다.

대기열에 실패한 경우 dequeue 프로 시저에 전달하는 dequeue_options_t 유형을 살펴보십시오. 가장 중요한 것은 dequeue_condition입니다. 특정 메시지 만 선택할 수 있기 때문에 모든 a와 all에 대해 작업을 시작할 수 있습니다. b 등.

+0

N 개의 대기열은 옵션이 아닙니다 (상대적으로 수명이 짧은 많은 다른 ID가 많습니다). dequeue 옵션 접근법의 문제점은 큐에 아직없는 (같은 id의) 향후 메시지에 대해 어떤 종류의 잠금을 필요로한다는 것입니다. 그렇지 않으면 다른 소비자 C2는 소비자 C1이 1 (둘 다 'a'유형의 메시지)을 소비하기 전에 메시지 2를 소비 할 수 있습니다. ATM 문제는 NOWAIT (시간 초과 => 0) 사용자 잠금으로 해결할 수 있다고 생각하지만 AQ에서이 문제에 대한 '기본'솔루션이 없다고 확신하지는 않습니다. – yawn