Oracle 데이터베이스 어댑터에서 폴링 기반 데이터 변경 메시지 받기
Microsoft BizTalk Adapter for Oracle Database는 Oracle 데이터베이스를 폴링하여 폴링 기반 데이터 변경 메시지 수신을 지원합니다. 어댑터는 다음을 통해 애플리케이션에 메시지를 전달합니다.
SQL SELECT 쿼리를 실행하여 데이터를 폴링에 사용할 수 있는지 여부를 확인합니다. SQL SELECT 쿼리를 주기적으로 또는 지속적으로 실행하도록 어댑터를 구성할 수 있습니다.
Oracle 테이블 또는 뷰에 대해 SQL SELECT 쿼리를 실행하거나 저장 프로시저, 함수 또는 패키지 프로시저 및 함수를 실행합니다.
Oracle 데이터베이스에서 선택적 폴링 후 PL/SQL 코드 블록을 실행합니다. 이 코드 블록은 대상에서 쿼리된 레코드의 필드를 업데이트하거나 쿼리된 레코드를 다른 테이블 또는 뷰로 이동하는 데 자주 사용됩니다.
쿼리를 반환하면 POLLINGSTMT 작업 또는 폴링 작업으로 노출되는 저장 프로시저, 함수 또는 패키지 프로시저 및 함수를 호출하여 결과 집합이 생성됩니다.
어댑터는 Oracle 트랜잭션 내에서 이러한 모든 작업을 실행합니다.
또한 어댑터를 사용하면 연결 URI에 매개 변수를 노출하여
PollingId
동일한 애플리케이션의 여러 Oracle 아티팩트에서 데이터 변경 메시지를 받을 수 있습니다. 이 매개 변수는 POLLINGSTMT 작업의 대상 네임스페이스를 수정합니다.
POLLINGSTMT의 대상 네임스페이스 변경
연결 URI에서 쿼리 문자열 매개 변수를 설정 PollingId
하여 POLLINGSTMT 작업의 대상 네임스페이스를 수정할 수 있습니다. 연결 URI에 가 PollingId
지정된 경우 Oracle 데이터베이스 어댑터는 매개 변수에 PollingId
지정된 문자열을 POLLINGSTMT 작업의 http://microsoft.lobservices.oracledb/2007/03/POLLINGSTMT
기본 대상 네임스페이스에 추가합니다. POLLINGSTMT 작업의 메시지 동작이 수정되지 않았습니다.
예를 들어 다음 연결 URI를 지정 OracleDb://User=SCOTT;Password=TIGER@Adapter?PollingId=AcctActivity
하면 대상 네임스페이스는 가 됩니다 http:/microsoft.lobservices.oracledb/2007/03/POLLINGSTMTAcctActivity
.
각 POLLINGSTMT 작업에 고유한 네임스페이스를 제공하여 애플리케이션의 여러 Oracle 테이블 및 뷰에 대해 데이터 변경 메시지를 받을 수 있습니다.
Oracle 데이터베이스 어댑터 연결 URI에 대한 자세한 내용은 Oracle 데이터베이스 연결 URI 만들기를 참조하세요.
바인딩 속성을 사용하여 데이터 변경 메시지 수신
다음 바인딩 속성의 일부 또는 전부를 설정하여 데이터 변경 메시지를 받도록 Oracle Database 어댑터를 구성합니다.
Binding 속성 | 값 | 기본값 | 필수/선택 |
---|---|---|---|
InboundOperationType | 값이 폴링으로 설정되어 있는지 확인합니다. | 폴링 | 필수 사항입니다. 명시적으로 설정하지 않으면 기본값이 적용됩니다. |
PolledDataAvailableStatement | 실행된 SELECT 문을 지정하여 특정 테이블에 대한 폴링에 사용할 수 있는 데이터가 있는지 여부를 확인합니다. 지정된 문은 행과 열로 구성된 결과 집합을 반환해야 합니다. 결과 집합의 첫 번째 셀에 있는 값은 어댑터가 PollingStatement 바인딩 속성에 지정된 값을 실행하는지 여부를 나타냅니다. 결과의 첫 번째 셀에 양수 값이 포함된 경우 어댑터는 폴링 문을 실행합니다. 예를 들어 이 바인딩 속성에 대한 유효한 문은 다음과 같습니다.Select * from <table_name> 참고: 이 바인딩 속성에 대한 저장 프로시저를 지정해서는 안 됩니다. 또한 이 문은 기본 Oracle 데이터베이스를 수정해서는 안됩니다. |
이중에서 1 선택 | 필수 사항입니다. 명시적으로 설정하지 않으면 기본값이 적용됩니다. 즉, 폴링되는 테이블에 데이터가 있는지 여부에 관계없이 어댑터가 폴링을 계속해야 했음을 의미합니다. |
PollingAction | 폴링 작업에 대한 작업을 지정합니다. 어댑터 서비스 추가 기능 사용을 사용하여 작업에 대해 생성한 메타데이터에서 특정 작업에 대한 폴링 작업을 확인할 수 있습니다. | null | SELECT 문을 사용하여 테이블 및 뷰에 대한 폴링 작업의 경우 선택 사항입니다. |
PollingInterval | 어댑터가 Oracle 데이터베이스를 쿼리할 간격(초)으로 설정합니다. 이 속성은 폴링 간격 및 폴링 트랜잭션 시간 초과를 지정합니다. 값은 Oracle 데이터베이스에서 쿼리 및 폴링 후 문(지정된 경우)을 실행하는 데 걸리는 시간과 클라이언트가 쿼리 데이터를 처리하고 폴링 응답 메시지를 반환하는 데 걸리는 시간보다 커야 합니다. | 500 | 필수 사항입니다. 명시적으로 설정하지 않으면 기본값이 적용됩니다. |
PollingStatement | 다음 중 하나를 지정합니다. - Oracle 데이터베이스에 대해 실행해야 하는 SQL SELECT 문입니다. 이 문에는 FOR UPDATE 절이 포함되어야 합니다. FOR UPDATE 절에 대한 자세한 내용은 이 항목의 뒷부분에 있는 폴링 문에서 FOR UPDATE 절 지정 을 참조하세요. - 폴링하려는 패키지 내의 저장 프로시저, 함수 또는 프로시저 또는 함수에 대한 메시지를 요청합니다. |
null | 필수 사항입니다. PollingStatement를 null이 아닌 값으로 설정하면 폴링이 가능합니다. |
PollWhileDataFound | Oracle 데이터베이스 어댑터가 폴링 간격을 무시하고 폴링되는 테이블에서 데이터를 사용할 수 있는 경우 Oracle 데이터베이스를 지속적으로 폴링하는지 여부를 지정합니다. 테이블에서 사용할 수 있는 데이터가 없으면 어댑터가 되돌려 지정된 폴링 간격으로 SQL 문을 실행합니다. | False | 필수 사항입니다. 명시적으로 설정하지 않으면 기본값이 적용됩니다. |
PostPollStatement | 쿼리를 수행한 후 클라이언트에 쿼리 데이터가 반환되기 전에 어댑터에서 실행되는 선택적 PL/SQL 코드 블록으로 설정합니다. | null | 선택 사항입니다. 값을 지정하지 않으면 post poll 문이 실행되지 않습니다. |
참고
WCF 서비스 모델 또는 WCF 채널 모델을 사용하는 경우 AcceptCredentialsInUri 바인딩 속성도 설정해야 합니다.
폴링 문에 FOR UPDATE 입력
SELECT 문을 폴링 문으로 사용하고 SELECT 문에 지정된 행에 영향을 주는 폴링 후 문을 실행하는 경우 폴링 문에서 FOR UPDATE 절을 사용해야 합니다. FOR UPDATE 절을 지정하면 폴링 문에서 선택한 레코드가 트랜잭션 중에 잠기고 폴링 후 문이 필요한 업데이트를 수행할 수 있습니다.
주의
폴링 문과 폴링 후 문 사이의 시간 창에서 폴링 후 문의 조건을 충족하는 테이블에 더 많은 레코드가 추가되는 시나리오를 가질 수 있습니다. 이러한 경우 폴링 후 문은 폴링 문의 일부로 선택한 레코드뿐만 아니라 조건을 충족하는 모든 레코드를 업데이트합니다.
폴링 후 문을 지정하고 폴링 문에 FOR UPDATE 절이 없는 경우 다음 두 조건 중 하나가 발생합니다.
TransactionIsolationLevel이 ReadCommitted로 설정된 경우 폴링 후 쿼리는 선택한 행을 업데이트하지 않습니다.
TransactionIsolationLevel이 Serializable로 설정된 경우 설문 조사 후 문이 실행될 때 다음 대상 시스템 예외(Microsoft.ServiceModel.Channels.Common.TargetSystemException)가 발생합니다. "ORA-08177은 이 트랜잭션에 대한 액세스를 직렬화할 수 없습니다.". 이러한 경우 어댑터가 동일한 트랜잭션을 다시 시도할 횟수를 정의하도록 PollingRetryCount 바인딩 속성을 설정해야 합니다.
트랜잭션 격리 수준을 설정하는 방법에 대한 지침은 Oracle Database를 사용하여 트랜잭션 격리 수준 및 트랜잭션 시간 제한 구성을 참조하세요.
어댑터 클라이언트가 트랜잭션을 사용하도록 구성하고 어댑터에서 UseAmbientTransaction 바인딩 속성의 값이 True 로 설정된 경우 폴링 및 폴링 후 문이 트랜잭션에서 실행됩니다.
FOR UPDATE 옵션을 사용하는 폴링 쿼리의 예는 다음과 같습니다.
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE
폴링 문에 NOWAIT 절 입력
동시 스레드가 폴링되는 테이블에 액세스하여 테이블에 너무 많은 경합이 발생하는 시나리오가 있을 수 있습니다. 이로 인해 폴링 쿼리가 차단되어 테이블 행에 대한 잠금이 발생할 수 있습니다. SELECT 문을 폴링 문으로 사용하는 경우 SELECT 문의 FOR UPDATE 키워드(keyword) 함께 NOWAIT 키워드(keyword) 지정할 수 있습니다. 이렇게 하면 폴링 쿼리가 선택하려는 행에 잠금이 있는 경우 어댑터 내에서 폴링 쿼리 실행이 즉시 반환됩니다. 일반적으로 Oracle은 이러한 조건에서 예외를 throw합니다. 다시 말하지만 어댑터 클라이언트는 PollingInterval 바인딩 속성을 사용하여 어댑터 클라이언트가 데이터 폴링을 위해 다시 시도해야 하는 시간 간격을 지정할 수 있습니다.
NOWAIT 옵션을 사용하는 폴링 쿼리의 예는 다음과 같습니다.
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE NOWAIT
폴링 문에 SKIP LOCKED 절 입력
폴링되는 테이블에 액세스하는 동시 스레드로 인해 폴링 쿼리에 지정된 WHERE 절의 결과 집합에 있는 일부 행이 잠긴 시나리오가 있을 수 있습니다. 예를 들어 폴링 쿼리는 테이블에서 6개의 행을 반환합니다. 이러한 6개 행 중 4개는 다른 트랜잭션으로 인해 이미 잠겨 있습니다. 이 경우 데이터베이스가 WHERE 절에 지정된 행을 잠그고 이미 잠긴 것으로 확인된 행을 건너뛰도록 지시하는 FOR UPDATE 키워드(keyword) 함께 SKIP LOCKED 키워드(keyword) 지정할 수 있습니다. WHERE 절에서 잠금 해제된 행은 트랜잭션 중에 잠기며 폴링 후 문은 이러한 행이 다시 폴링되지 않도록 필요한 업데이트를 수행할 수 있습니다. 이렇게 하면 WHERE 절에 지정된 모든 행이 잠금 해제될 때까지 폴링 메시지를 받을 때까지 기다릴 필요가 없습니다.
SKIP LOCKED 키워드(keyword) 데이터베이스에서 동일한 테이블을 폴링하는 여러 컴퓨터에 어댑터 클라이언트가 있는 시나리오에서 유용합니다. 해당 시점에 잠금 해제된 WHERE 절로 지정된 행에 대한 폴링 기반 데이터 변경 메시지를 수신하는 방식으로 폴링 작업을 구성하여 어댑터 클라이언트 간에 부하를 분산한 다음, 어댑터 클라이언트에서 폴링 기반 데이터 변경 메시지를 수신하는지 확인하도록 행을 업데이트할 수 있습니다. 다른 클라이언트는 동일한 메시지를 받지 않습니다.
SKIP LOCKED 옵션이 있는 폴링 쿼리의 예는 다음과 같습니다.
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE SKIP LOCKED
FIFO(주문 배송) 지원
프로덕션 환경에서 폴링을 사용하여 Oracle 데이터베이스의 데이터 변경 내용을 모니터링할 수 있습니다. 이러한 데이터 변경 메시지는 Oracle 데이터베이스 어댑터를 사용하여 어댑터 클라이언트에서 수신됩니다. 비즈니스 시나리오에 따라 어댑터 클라이언트에서 데이터 변경 메시지를 올바른 순서로 수신하는 것이 중요할 수 있습니다.
Oracle 데이터베이스 어댑터는 Oracle 데이터베이스에서 메시지를 받는 순서를 유지하기 위해 주문된 배달 또는 FIFO(선점)를 지원합니다. Oracle 데이터베이스 어댑터에 대한 인바운드 시나리오에서 FIFO 지원과 관련된 몇 가지 고려 사항은 다음과 같습니다.
오케스트레이션에서 메시지를 사용하는 경우 오케스트레이션에는 Oracle 데이터베이스 어댑터 수신 포트에서 오는 메시지에 대해 정렬된 배달 세트가 있어야 합니다.
송신 포트(콘텐츠 기반 라우팅) 시나리오에서 메시지를 사용하는 경우 송신 포트에는 Oracle 데이터베이스 어댑터 수신 포트에서 오는 메시지에 대한 주문 배달 집합이 있어야 합니다.
WCF-Custom 또는 WCF-OracleDB 어댑터에는 인바운드 처리 에 실패한 요청 메시지를 일시 중단할지 여부를 지정하는 오류 발생 시 요청 일시 중단 메시지 속성이 있습니다. 이 속성은 WCF-Custom 메시지 탭에서 설정하거나 오류 처리 섹션에서 수신 포트를 WCF-OracleDB 수 있습니다. 다음 표에서는 이 속성이 설정되었는지 여부와 메시지 구독자(오케스트레이션 또는 포트)의 상태에 따라 들어오는 메시지를 처리하는 방법을 설명하는 시나리오를 나열합니다.
Port 속성 | 목록에 없는 상태의 구독자 | 등록되었지만 중지됨 상태의 구독자 |
---|---|---|
실패 속성에 대한 요청 메시지 일시 중단 설정 안 됨 | - 라우팅 실패 보고서가 일시 중단됨으로 생성됨(다시 시작할 수 없는 메시지) - 실제 메시지가 일시 중단되지 않음 - 트랜잭션이 중단되면 폴링 후 쿼리가 실행되지 않습니다. 따라서 폴링은 반복되고 행을 다시 가져옵니다. - 발생한 작업을 설명하기 위해 이벤트 로그에 보고된 오류입니다. |
- "실패"로 간주되지 않습니다. 이벤트 로그에 오류 메시지가 없습니다. - 실제 메시지는 일시 중단(다시 시작할 수 있음) 큐에 배치됩니다. - 구독 포트 또는 오케스트레이션이 시작되면 메시지가 자동으로 다시 시작됩니다. 구독자에서 주문된 배달이 설정된 경우 적용됩니다. - 메시지가 수동으로 다시 시작될 수도 있습니다. |
오류 속성 IS 집합에 대한 요청 메시지 일시 중단 | - 라우팅 실패 보고서가 일시 중단됨으로 생성됨(다시 시작할 수 없는 메시지) - 실제 메시지도 일시 중단됨 - 트랜잭션이 중단되면 폴링 후 쿼리가 실행되지 않습니다. 따라서 폴링은 반복되고 행을 다시 가져옵니다. - 발생한 작업을 설명하기 위해 이벤트 로그에 보고된 오류입니다. |
- "실패"로 간주되지 않습니다. 이벤트 로그에 오류 메시지가 없습니다. - 실제 메시지는 일시 중단(다시 시작할 수 있음) 큐에 배치됩니다. - 구독 포트 또는 오케스트레이션이 시작되면 메시지가 자동으로 다시 시작됩니다. 구독자에서 주문된 배달이 설정된 경우 적용됩니다. - 메시지가 수동으로 다시 시작될 수도 있습니다. |
추가 정보
Oracle Database 애플리케이션 개발
BizTalk Server 사용하여 Oracle 데이터베이스 폴링
WCF 서비스 모델을 사용하여 Oracle Database에서 폴링 기반 데이터 변경 메시지 수신
WCF 채널 모델을 사용하여 Oracle Database에서 폴링 기반 데이터 변경 메시지 받기