sql >> データベース >  >> RDS >> PostgreSQL

Postgresの例外とJava

    SQLExceptoinをキャッチ 次に、 SQLException.getSQLState()<を使用します。 / code> それを比較して、希望どおりかどうかを確認します。

    catch (SQLException ex) {
       final String ss = ex.getSQLState();
       //... blah blah ...
    }
    

    PostgreSQLエラーコード を参照してください。 SQLStateの詳細については。 (ほとんどの状態カテゴリとコードはDB全体で標準ですが、すべてのDBが同じ方法でそれらを実装して同時にスローするわけではなく、ほとんどのDBにはDB固有の追加機能があります)。

    SQLStateに基づいて例外をキャッチする方法はありません。残念ながら、それをキャッチする必要があります。それが必要なものでない場合は、ラップして再スローします。 (ラップせずに再スローするだけでなく、元のスタックが失われます)。

    JDBC 4には、 SQLExceptionのサブクラスがあります。 SQLNonTransientExceptionのように これはキャッチできますが、JDBCドライバーがそれらのサブクラスをスローする場合に限ります。執筆時点では、PgJDBCはこれらをサポートしておらず、常に SQLExceptionをスローします。 、だから、あなたがそれらを捕まえようとすると、あなたは何も捕まえないでしょう。 (パッチは大歓迎です!)

    現実の世界では、通常、さまざまなエラー状態に関心があり、それらに基づいてさまざまなことを実行したいと考えています。

    テストされていない、ウィンドウに書き込まれたもののようなもの:

    } catch (SQLException ex) {
      final String ss = ex.getSQLState();
      if (ss.equals("40001") || ss.equals("40P01")) {      
         /* It is a serialization failure or a deadlock abort. Retry the tx. */
         retry_transaction = true;
      } else if (ss.startsWith("08") || ss.startsWith("53")) {
         /* It is a connection error or resource limit. Reconnect and retry. */
         try {
            conn.close();
         } catch (SQLException ex) { 
            logger.log("Error closing suspected bad connection after SQLState " + ss, ex);
         }
         conn = null; /* App knows to reconnect if it sees a null connection */
         retry_transaction = true;
      } else {
         throw new MyAppException(ex);
      }
    }
    

    ...アプリがnull接続を検出した場合に再接続することを認識し、試行したトランザクションの記録を保持するため、デッドロックまたはシリアル化の失敗に遭遇した場合に成功するまでループで再試行できます。

    実際には、これよりも賢く、再試行のレート制限などを追加します。これは単純な例にすぎません。

    詳細については、例外を PSQLException<にキャストしてください。 / code> キャスタビリティをテストした後、または PSQLExceptionとしてキャッチします そもそも。次に、以下で詳細を取得します:

    ex.getServerErrorMessage()
    

    これにより、 ServerErrorMessageが得られます。 詳細なフィールドがあります。



    1. INSERT INTO Table (etc) SELECT * FROM Table2 中に挿入された各行でトリガーを起動するにはどうすればよいですか?

    2. SQLスクリプトを検証するためのコード

    3. HadoopでApacheエアフローを使用してMySqlを構成する際の問題に直面しています

    4. InnoDBとMyISAMの挿入クエリ時間