2014-09-08 2 views
0

TblTransactions 테이블에 데이터를 삽입하는 석영 일정이 있습니다. TblTransactions에서 레코드를 가져오고 처리하고 레코드를 삭제하는 여러 인스턴스/스레드가있는 다른 Quartz 스케줄을 실행하려고합니다.최대 절전 모드 대기열 구현

스레드가 가져온 레코드가 다른 스레드에 의해 페치되지 않도록하려면 어떻게합니까?

oracle 고급 대기열을 최대 절전 모드로 통합 할 수 있습니까? 다른 옵션에는 무엇이 있습니까?

Oracle 11g에서 최대 절전 모드를 사용하고 있습니다.

답변

0

여러 스레드가 동일한 테이블을 읽는 경우, 데이터베이스에 페치 된 것으로 표시하더라도 (다른 스레드가 트랜잭션을 커밋하기 전에 행을 읽을 수 있음) 많은 레코드가 두 번 읽히지 않으면 매우 까다로울 수 있습니다.

내가 구현할 방법은 단일 스레드를 사용하여 레코드를 가져 와서 처리하고 N 개의 레코드를 각 프로세서 스레드에 위임하고 Futures 또는 콜백을 사용하여 진행 상황을 추적합니다 (일부 경우 프로세서 스레드가 실패하면 처리를 위해 레코드를 다시 제출하고/또는 로그/이메일을 통해 관리자에게 경고를 보내서 잘못된 데이터 등이있는 경우이를 확인하도록합니다.)

프로세서 스레드는 완료 될 때 처리 된 레코드 자체를 제거 할 수 있습니다 (단일 레코드가 처리 된 직후 또는 모든 레코드가 처리 된 후 한 번에 모두 제거 할 수 있음) fetch-thread에서 레코드를 프로세서 스레드에 매핑하기위한 매핑. 일단 스레드가 성공적으로 완료되면 처리 된 모든 레코드를 제거합니다.

주기적으로 페칭 작업을 호출하고 여전히 처리중인 오래된 레코드가있을 수있는 경우 페치 된 레코드에 이미있는 레코드가 포함되어 있는지 확인하기 위해 fetch-thread -side에서 매핑이 필요할 수 있습니다 이전 fetch-run에서 처리합니다.

관련 문제