2012-10-19 2 views
2

일괄 쿼리 크롤러 작업에 대한 추상화를 만들려고합니다. 개념은 쿼리가 실행되고 결과 집합이 얻어지고 각 행에 대해 커밋 또는 롤백 중 하나가 수행되는 작업입니다. 요구 사항은 모든 행이 실패 여부와 상관없이 처리되고 결과 집합이 미리 메모리에로드되지 않는다는 것입니다.일괄 쿼리 크롤러 작업 패턴

문제는 롤백 후 열린 결과 집합을 유지 관리 할 수 ​​없다는 사실로 귀결됩니다. 이것은 사양에 따라 커서 보존 기능은 커밋 (ResultSet.HOLD_CURSORS_OVER_COMMIT 사용)에서 유지 관리되지만 롤백에서는 유지 관리 할 수 ​​없습니다.

UserTransaction tx = getUserTransaction(); 
tx.begin(); 
ResultSet rs = executeQuery(); //extension point 
tx.commit(); 
while(rs.next()) { 
    tx.begin(); 
    try { 
     performOperationOnCurrentRow(ResultSet rs); //extension point 
     tx.commit(); 
     logSuccess(); 
    }catch(Exception e) { 
     tx.rollback(); 
     logFailure(e); 
    } 
} 

이하지 않는 : 각 행의 실제 작업을 명시 할에 대한 쿼리 하나를 지정하기위한 두 개의 확장 점을 제공

JTA/JDBC 의미를 가진 본래의 구현은,이 같은 것 그렇게 먼 시나리오 인 것 같지만, 나는 웹상에서 관련 정보가 거의 없다. 문제는 이것이 인기있는 프레임 워크 중 어떤 것에 의해서 우아하게 다루어 졌는가라는 것입니다. 상자 솔루션을 꼭 사용할 필요는 없습니다.이 시나리오를 처리하기 위해 알려진 좋은/일반적으로 받아 들여지는 접근 방식이 있는지 궁금합니다.

한 가지 해결책은 실패한 행을 추적하고 해당 지점 다음에 커서를 다시 여는 것입니다. 일반적으로 일부 확장 규칙을 적용해야합니다 (예 : 정렬 된 결과 집합, where 절에서 마지막으로 실패한 행 ID를 사용하여 쿼리 기타).

또 다른 두 개의 스레드를 쿼리와 행 작업에 사용하는 것입니다.

무엇을 하시겠습니까?

답변

1

2 년 전부터 아직 답변을 얻지 못했기 때문에 계속해서 답변 해 드리겠습니다.

우리가 일이 솔루션은 (BatchProcess라고도 함) 프로세스가 Query (SQL에 제한되지는 마음을) 실행하고 동시 Queue에 그 결과를 추가하는 아이디어를 중심으로 돌아 가지. BatchProcessQueue의 항목을 소비하고 해당 항목을 입력으로 사용하는 Operation을 실행하는 수많은 QueueProcessor 개체 (새 스레드에서 실행)를 생성합니다. 각 Operation 실행은 단일 작업 단위로 수행됩니다. 기본 트랜잭션 관리자는 JTA 구현입니다.

비트는 일자,하지만 어느 시점에서 구현이 어딘가에 그 REPO에서 BatchProcess 모니터링 및 관리를위한 심지어 GUI

있다 https://bo2.googlecode.com/svn/trunk/Bo2ImplOpen/main/gr/interamerican/bo2/impl/open/runtime/concurrent/BatchProcess.java이었다)

면책 조항 :이 사람은 많이했다 이 설계 및 구현과 관련하여 https://stackoverflow.com/users/2362356/nakosspy

UML diagrams for Batch Process objects