2011-03-11 26 views
1

C#.Net OracleBulkCopyを使用して、コミット時に削除として宣言されたグローバル一時表にデータをコピーしています。だから私はOracleBulkCopy.WriteToServer(DataReader)を使用します。それはコミットし、私はすべてのデータを失っています。これを防ぐ方法は?OracleBulkCopy AutoCommits

+0

なぜグローバルテンポラリテーブルを使用していて、正規のテーブルを使用していないのですか? –

+0

@bernd_k既存のアプリケーションはすべて同じ方法で動作するためです。データをソーステーブルから一時テーブルにコピーし、ストアドプロシージャを実行して、一時テーブルから永久にデータを移動します。これは、複数のスレッドが同時にグローバルtempテーブルにアクセスする中間層を使用して行われるため、2つのセッションがデータを共有しないようにコミット時の削除が使用されます。 –

答えて

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:複数のスレッドが同じグローバルtempテーブルに同時にアクセスするときに、コミット時にdeleteを使用しないと問題が発生します。 –

+0

すべてのスレッドで同じoracleセッションが使用されていますか? –