DB サーバーと通信する Java アプリケーションがあります。自動コミット モードを false に設定する必要があるため、1 秒に 1 回コミットを実行するスケジュールされたタスクがあります。
そのようなサーバーが一時的にアプリから到達できない場合、データの損失を回避しようとしています。
Connection stableConn = ...;
stableConn.setAutoCommit(false);
//create the task to commit changes every second:
commitTask = new Timer("CommitOnDB");
commitTask.schedule(new TimerTask() {
@Override
public void run() {
boolean exit = false;
//if the connection to DB is lost, loop until it is re-established:
while(!exit) {
try {
stableConn.commit();
exit = true;
} catch (SQLException e) {
exit = !"08007".equals(e.getSQLState());
log.error("Cannot commit statements due to " + e + ";state=" + e.getSQLState(), e);
}
}
}
}, 1000, 1000);
接続が切断されたときに 08007 SQLState をキャッチしようとしましたが、とにかく、ループの 2 回目のラウンドで、接続が既に閉じられていることを示す別の例外が発生します。
さらに、MS SQL Server、MySQL、Oracle など、さまざまな DBMS で正常に動作するコードが必要です。
誰かが私を正しい方向に向けることができますか?