2011-02-16 4 views
2

두 개의 별도 데이터베이스에있는 두 개의 PL/SQL 시스템이 있습니다. SystemA는 SystemB 테이블을 채워야합니다. 이것은 아마도 데이터 링크를 통해 수행됩니다. 일련의 레코드가 SystemB의 테이블에 삽입 될 때마다 SystemB의 프로세스가 실행되어야합니다. SystemA에서 처리를 시작하기 위해 SystemA가 완료 될 때까지 기다릴 수 있었지만 SystemA에서 처리를 시작한 다음 SystemB를 채우는 데 많은 시간을 할애 할 수 있었기 때문에 SystemB가 사용 가능한 즉시 각 레코드 집합을 처리하게했습니다. 세트는 다른 사람들과 독립적으로 처리되어 OK 일을해야한다).PL/SQL의 이벤트 드리븐 프로그래밍

필자가 잘 모르는 부분은 PL/SQL에서 짝수 중심의 프로그래밍을 수행하는 방법입니다. SystemB에 세트가 처리 준비가되었음을 알리기 위해 SystemA가 필요합니다. 내 첫 번째 생각은 SystemB에서 특별한 "이벤트"테이블을 가지고 있었고 SystemA가 세트를 마쳤을 때 "이벤트"테이블에 삽입하고 프로세스를 시작하는 삽입에 트리거가 있고 (프로세스가 긴 것일 수 있음) , 아마도 프로세스 당 5-10 분). 필자는 오라클에서 트리거를 사용한 경험이 충분하지 않아이 방법이 기존 방식인지 또는 더 나은 메커니즘이 있는지 알지 못합니다. 제안? 팁? 조언?

답변

6

Oracle Advanced Queuing을 사용하십시오. 이것을 위해 설계되었습니다. 두 시스템 (A에서 대기열을 사용하기 위해이 경우 B에서 A까지) 사이에 데이터베이스 링크를 설정해야한다고 생각합니다.

+0

A에서 B까지 dblink가있어 A가 B의 테이블에 삽입 할 수 있습니다. 대기열은 A에 있어야하고 B는 B에 대한 링크가 필요합니까? – FrustratedWithFormsDesigner

+0

일반적으로 A에 대한 프로세스가 삽입되는 B의 프로세스는 B의 프로세스가 메시지를 큐에서 제거하고 AQ를 사용하여 A의 큐에 메시지를 전달할 것입니다. 이렇게하면 코드가 일시적으로 중단 된 네트워크 연결 문제를 처리 할 필요가 없습니다. AQ가 원격 시스템으로의 전달을 처리합니다. –

+0

아니요, 대기열은 A에 있습니다. B는 A의 대기열을 읽고 필요한 모든 작업을 수행합니다. A가 데이터베이스 링크를 통해 트리거를 사용하여 B에 데이터를 "밀어 넣은"경우, 예를 들어 A의 처리 능력은 B의 가용성과 그 사이의 네트워크의 안정성에 의해 제한됩니다. 나는 OP가 각 레코드 또는 B 레코드의 일괄 처리를 한 번만 처리하려고한다는 가정하에 작업하고 있습니다. 그렇다면 A에있는 영구적 인 단일 소비자 대기열을 사용하면 B가 각 메시지를 읽고 그 메시지의 유일한 수신자가 될 수 있습니다. –

2

그렇습니다. 오라클 어드밴스 큐 (Oracle Advance Queues) 또는 A에게 오라클 작업을 B에 제출하는 것조차 더 좋은 아이디어입니다.

그리고 프로세스가 A에서 B로 데이터의 완전한 복제를 필요로한다면 Oracle Streams 프로세스와 같은 것을보고 데이터를 복사 한 다음 처리해야 할 수 있습니다.

+0

그것은 복제가 아니며 A에서 B로 옮겨지는 증류입니다. Oracle Jobs도 살펴 보겠습니다. 감사! – FrustratedWithFormsDesigner

관련 문제