0

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 で正常に動作するコードが必要です。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

次のようなチェックを追加します。

if(stableConn.isClosed()) {
    stableConn = getRecoveredConnection();
} 

または

if(!SomeHelper.isValid(connection)) {
   ... 
}

SQL例外の中には、データベースがあなたの操作を好まないことを伝えるだけで、他の人(あなたの場合のように)がセッションを無効にするため、実際にはcatchまたはfinallyで行う方がよいでしょう。

于 2013-01-21T19:55:37.247 に答える