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
が得られます。
詳細なフィールドがあります。