テキストファイルからデータベースに多くのSQL行を挿入するためのJavaコードがあります。setAutoCommit(false) で接続をプログラムし、最後にエラーが発生しない場合 (すべてのメソッドが Throwable をスローすることが検出された場合)、コミットを送信します。タスクには通常 30 分かかります。
ケーブル接続では非常にうまく機能しますが、wifi接続では、接続が短時間失われることがあるため、最後に到達することはありません.
それを解決するために。私は 2 つのことをプログラムしました: テキスト ファイルの行は、ArrayList 内のすべての行を持つシリアル化されたオブジェクトに変換され、int インデックスを持つ他のシリアル化されたオブジェクトを作成し、正常に挿入された最後の行のインデックスを保存します。
次に、プログラムでこれを行います:
charge in memory the object.lines, from the serialized object.
charge in memory the object.index, from the serialized object.
擬似コード:
loop:
index = sum 1 to the object.index
line = object.getLine(index)
insert line
if error continue (or goto loop)
send commit
if error continue (or goto loop)
object.index = index
serialize object
このようにして、データベースに正常にコミットされた行のバックアップがあり、別の時間にジョブを続行できます。行に接続の問題がある場合は、もう一度行を挿入してみることができます。
接続に問題がある場合は、1 分待ちます。接続は回復しますが、私ではなく自動的にリセットされます。
次に、たとえば次のような行で:
INSERT INTO my_table1 (id) VALUES (sq_mytable1_id.NEXTVAL);
//success
//connection lost
//connection reset
INSERT INTO my_table2 (id) VALUES (sq_mytable1_id.CURRVAL);
//error, sq_mytable1_id.CURRVAL is not in session.
接続がリセットされ、セッションから sq_mytable1_id.CURRVAL を取得できるため、ORA-08002 例外が発生します。
Wi-Fi での接続ダウンに耐えられるバッチ SQL インサータをどのようにプログラムするかについてのアイデアを教えてください。
接続をシリアル化すると思いますが、できません: oracle.jdbc.driver.T4CConnection はシリアル化できません。