2009-05-29 3 views
8

Oracle Database와 함께 Java-JDBC API에 약간의 요구 사항이 있습니다. 내가 오라클에 대한 사실이며,이 link과 유사한 예제를 사용하고 있습니다 autoCommit을 기본값으로했습니다.JDBC 일괄 업데이트 문제

그러나 1000 개의 배치를 추가하면 각각이 삽입이라고 말할 수 있습니다. 그리고 약 20 개의 레코드가 몇 가지 제약 조건을 위반했다고 가정합니다. 나머지 980은 데이터베이스에 COMMITTED (이후에는 다른 연결을 사용하는 다른 쿼리에서 볼 수 있음)하고 20 개의 레코드를 무시하기를 원합니다. 위의 예에서 한 행이 트랜잭션을 위반하면 catch 블록에서 커밋 할 때 트랜잭션은 첫 번째 오류까지 만 커밋합니다.

일괄 처리 업데이트는 모든 행이 통과하고 예외 처리가 하나가 아니라는 것을 확실히 알고있을 때만 수행되지만 기존 데이터베이스를 패치하여 "일종의 불량 사례"는 괜찮습니다. :) 모든 코드 샘플을 높이 평가할 것입니다. 내가 그렇게 매일 1000 개 개의 레코드를 일괄 처리하고 3M 행에 가까운 처리하고 있기 때문에 간단한 삽입/업데이트를 사용

**** 자세한 내용 ****

괜찮 없습니다. 루프에 1000 개의 인서트 (예외 제외)를 추가하는 것만으로도 배치 업데이트 < 300ms가 아닌, 더 많은 시간이 소요됩니다 (매 1000 레코드 당 약 5 초).

문제점 :Oracle 데이터베이스에서 드라이버는 첫 번째 FAILURE에서 멈춘 것처럼 보입니다. 즉, 1000 행이 배치되고 100 번째 오류가 발생하면 1000 번째 행까지 진행합니다. 내 생각에 이것은 JDBC에서 (오라클과 함께) 할 수 없다고 생각합니다 link처럼 소수의 데이터베이스 만 이러한 기능을 지원하고 있음을 나타냅니다. 아마도 오라클은 하나가 아닙니다.

+2

삽입물을 하나씩 수행하는 것을 방지 할 수있는 방법은 무엇입니까? 공연? –

+0

일괄 처리 큐에 데이터를 추가하기 전에 제약 조건을 프로그래밍 방식으로 테스트 할 수 있습니까? – Elijah

+0

예, 질문에 업데이트 된 처리 시간을 확인하십시오 –

답변

1

"Oracle 데이터베이스를 사용하면 드라이버가 첫 번째 오류 (예 : 1000 행이 일괄 처리되고 100 번째 오류가 발생한 경우)에서 멈추는 것처럼 보입니다. 1000 번째 행까지 계속 진행하고 싶습니다." 기본적으로 Oracle JDBC 드라이버로이 작업을 수행 할 수 있는지 알고 싶었습니다.

그러나 답변의 다양한 제안되었다

(이미 고려했다 모두/가장) 1) 제약/부하 데이터를 비활성화/행의 기분을 상하게 제거/반복이 몇 번 2) 적재하기 전에 모든 검사를 수행 데이터 3) 배치 크기를 50 - 100으로 줄입니다.

불행히도로드를 수행하고 배치 크기를 50 또는 100으로 만들 수 없다는 것은 5M 행을 수행하는 데 더 많은 시간이 걸린다는 것을 의미합니다 (총 시간은 배치 시간이 40 분이 아닌 몇 시간으로 증가 함) 1000). 배치 크기를 1000 으로 유지하고이 코드를으로 받아들이고 "while"루프 아래에 코드를 삽입하고 모든 행을 채울 때까지 작업을 수행했습니다.

내가 말했듯이, 첫 번째 실패 이후에 진행할 ORACLE BATCH JDBC NOWAY가 있기 때문에이 질문에 대한 대답은 "NOT DOABLE"이며 제약 조건을 수락하고이 도구가 완료까지 40 분 :

1

시도해 볼 수 있습니다 : 50 또는 100의 배치로 시작하십시오. 그들은 성공적으로 처리 될 수있는 좋은 가능성을 가지고있다). 실패한 사람은 하나씩 처리합니다.

다른 가능성 : 제약 조건을 비활성화하고, 데이터를로드하고, 제약 조건을 위반하는 행을 삭제하십시오.

1

내가 제약 조건 위반이있는 경우 제약 조건을 위반하지 않은 경우 그 레코드를 삽입보다되는지를 확인해 볼 필요가있다.

2

제약 조건이없는 작업 테이블에 삽입 한 다음 위반 사항을 삭제 또는 수정하고 나머지는 단일 SQL 문에서 실제 테이블로 INSERT SELECT해야합니다.

0

예외 테이블을 만들고 프로 시저가 예외를 발생시키지 않지만 모든 예외를 데이터베이스에 저장하는지 확인하십시오. 모든 작업이 완료되면 예외 테이블을 쿼리하고 레코드를 확인할 수 없습니다.