C#.Net OracleBulkCopyを使用して、コミット時に削除として宣言されたグローバル一時表にデータをコピーしています。だから私はOracleBulkCopy.WriteToServer(DataReader)を使用します。それはコミットし、私はすべてのデータを失っています。これを防ぐ方法は?OracleBulkCopy AutoCommits
答えて
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;
あなたは動的挿入文を生成すると言っています。すでにこれを使用していますが、OracleBulkCopyの方が早いと思っていました。 –
はい、図のようにバルクインサートを使用してください。 OracleBulkCopyは少し速くても、おそらく多分そうではないかもしれません。私はわかりません。バルクインサートは非常によく機能します。 –
とにかく.NETを使用する場合にコミット時に削除してグローバル・テンポラリ・テーブルを宣言することは良いアイデアではありません。
より良い習慣は、あなたが望むことをする前にgttから削除し、コミット後にそのまま放置することです。デバッグも容易になります。
@bernd_K:パフォーマンスが最悪の場合は、このようなテーブルから削除するのが賢明です。ちょうどデータを忘れて、コミットによってクリーンアップしてください。その場合、データは非常に効率的に「蒸発」するだけです。 –
@bernd_K:複数のスレッドが同じグローバルtempテーブルに同時にアクセスするときに、コミット時にdeleteを使用しないと問題が発生します。 –
すべてのスレッドで同じoracleセッションが使用されていますか? –
なぜグローバルテンポラリテーブルを使用していて、正規のテーブルを使用していないのですか? –
@bernd_k既存のアプリケーションはすべて同じ方法で動作するためです。データをソーステーブルから一時テーブルにコピーし、ストアドプロシージャを実行して、一時テーブルから永久にデータを移動します。これは、複数のスレッドが同時にグローバルtempテーブルにアクセスする中間層を使用して行われるため、2つのセッションがデータを共有しないようにコミット時の削除が使用されます。 –