2011-03-11 2 views
1

C# .Net OracleBulkCopy를 사용하여 커밋시 삭제로 선언 된 전역 임시 테이블에 데이터를 복사하고 있습니다. 그래서 OracleBulkCopy.WriteToServer (DataReader)를 사용합니다. 그것은 커밋하고 모든 데이터를 잃고 있습니다. 이것을 방지하는 방법?OracleBulkCopy AutoCommits

+0

왜 일반 테이블이 아닌 전역 임시 테이블을 사용하고 있는지 알 수 있습니까? –

+0

@bernd_k 기존 응용 프로그램이 모두 동일한 방식으로 작동하기 때문입니다. 원본에서 임시 테이블로 데이터를 복사하고 저장 프로 시저를 실행하여 임시 테이블에서 영구 테이블로 데이터를 이동합니다. 이것은 여러 스레드가 동시에 전역 임시 테이블에 액세스하는 중간 계층을 사용하여 수행되므로 커밋시 삭제가 사용되므로 두 세션이 데이터를 공유하지 않습니다. –

답변

2

OracleBulkCopy는 트랜잭션을 지원하지 않는 것 같습니다. 자동 커밋은 결코 사용하기가 현명하지 않으며 대량 삽입을 사용하여보다 제어 된 방식으로 복사합니다.

OPEN z; 
LOOP 
    FETCH z BULK COLLECT INTO z_array LIMIT z_array_size; 

    FORALL i IN 1..z_array.COUNT 
    INSERT INTO t2 VALUES z_array(i); 

    EXIT WHEN z%NOTFOUND; 
END LOOP; 
+0

동적 삽입 문을 생성한다고 말합니다. 우리는 이미 이것을 사용하여 OracleBulkCopy를 시도하고 싶었습니다. –

+0

예, 표시된대로 벌크 삽입물을 사용하십시오. OracleBulkCopy는 조금 빨라 졌을 수도 있고 그렇지 않을 수도 있습니다. 나는 잘 모르겠다. 벌크 삽입물은 매우 잘 수행됩니다. –

0

에 삭제 어쨌든 .NET을 사용하는 경우 커밋으로 전역 임시 테이블을 선언 할 좋은 생각입니다.

더 나은 연습은 gtt에서 원하는 것을 수행하기 전에 삭제하고 커밋 한 후 그대로 두는 것이 좋습니다. 디버깅도 쉬워집니다.

+2

@bernd_K : 성능상 가장 나쁜 일은 그러한 테이블에서 삭제하는 것입니다. 그냥 데이터에 대해 잊어 버리고 커밋에 의해 정리해야합니다. 이 경우 데이터는 매우 효율적으로 증발됩니다. –

+0

@bernd_K : 여러 스레드가 동일한 전역 임시 테이블에 동시에 액세스 할 때 커밋시 삭제를 사용하지 않으면 문제가 발생합니다. –

+0

및 모든 스레드가 동일한 oracle 세션을 사용합니까? –

관련 문제