일괄 쿼리 크롤러 작업에 대한 추상화를 만들려고합니다. 개념은 쿼리가 실행되고 결과 집합이 얻어지고 각 행에 대해 커밋 또는 롤백 중 하나가 수행되는 작업입니다. 요구 사항은 모든 행이 실패 여부와 상관없이 처리되고 결과 집합이 미리 메모리에로드되지 않는다는 것입니다.일괄 쿼리 크롤러 작업 패턴
문제는 롤백 후 열린 결과 집합을 유지 관리 할 수 없다는 사실로 귀결됩니다. 이것은 사양에 따라 커서 보존 기능은 커밋 (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를 사용하여 쿼리 기타).
또 다른 두 개의 스레드를 쿼리와 행 작업에 사용하는 것입니다.
무엇을 하시겠습니까?