M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

SQLExceptionのサブクラスたち

"Upgrade to Java SE7 Programmer"試験の参考書を読んでいて説明不足感のあったSQLExceptionのサブクラスたちについて、Oracleの公開している“Java™ Platform, Standard Edition 7 API Specification”を読んでみた。以下、翻訳結果。

     * * *

SQLException

この例外はデータベース・アクセスにおけるエラーやその他のエラーについて情報を提供するものです。それぞれのSQLExceptionは、幾種類かの情報を提供します。

  • エラーの文字列による説明。これはJava例外メッセージとして使われるもので、getMessageメソッドにより取得できます。
  • “SQLstate”文字列。XOPEN SQLstate規約もしくはSQL:2003規約に準拠します。SQLState文字列の値は適切な詳細情報により説明されています。DatabaseMetaData オブジェクトのメソッドgetSQLStateTypeを使用して、ドライバがXOPENタイプとSQL:2003タイプのいずれを返すのかを知ることができます。
  • ベンダー個別が個別に定めている整数のエラー・コード。一般的には、このコードはAPIの下層にいるデータベースが返したエラー・コードのそのものです。
  • 次の例外への連鎖。後続のエラー情報を提供するのに使用されます。
  • 因果関係。もしこのSQLExceptionに関係するものがあればその情報。

BatchUpdateException extends SQLException

バッチ更新処理中にエラーが発生した場合にスローされるSQLExceptionのサブクラスです。
SQLExceptionが提供する情報に加えて、BatchUpdateExceptionはバッチ更新処理中に成功裏に実行されたすべてのコマンド──エラー発生前に実行されたすべてのコマンド──による更新件数の情報を提供します。更新件数の配列〔int[]〕の要素の順番は、それぞれのコマンドがバッチ更新のためのStatementに登録された順番と対応します。

バッチ更新のなかで特定のコマンドの実行に失敗し、BatchUpdateExceptionがスローされたとき、ドライバはバッチ更新の残りのコマンドの実行を継続することもあれば、しないこともあるでしょう。失敗の後ドライバが処理を継続する場合、BatchUpdateException.getUpdateCountsメソッドが返す配列は、エラーが発生する前に正常に実行されたコマンドの要素〔更新件数〕だけでなく、すべてのコマンドの要素〔同前〕を含むことになります。ドライバがコマンド処理を継続した場合、当該の配列には失敗したコマンドのそれぞれに対応する要素としてStatement.EXECUTE_FAILEDが格納されます。

RowSetWarning extends SQLException

RowSetオブジェクトに関するデータベース警告についての情報を提供するSQLExceptionの拡張クラスです。警告はそのメソッド呼び出しにより通報すべき事項を発生させたオブジェクトに暗黙のうちに結びつけられます。このクラスはSQLWarningクラスを補完するものです。

RowSet警告は、JdbcRowSetやCachedRowSet、WebRowSet、FilteredRowSetそしてJoinRowSet実装などから取得することができます。いずれのRowSet実装も、それらについての最初の警告を取得するには、JdbcRowSetインターフェースもしくはCachedRowSetインターフェースに定義されているgetRowSetWarningsメソッドを使用します。最初の警告に続く別の警告を取得するには、RowSetWarningのgetNextWarningメソッドを使用します。このようにして返された警告情報から後続の警告を得るには、〔繰り返し〕RowSetWarningオブジェクトのgetNextWarningメソッドを呼び出します。継承したメソッドであるgetMessage、getSQLState、そしてgetErrorCodeはRowSetWarningに格納された情報を取得します。

SerialException extends SQLException

BLOBやCLOB、STRUCTやARRAYといったSQL型に加え、DATALINKやJAVAOBJECTのようなSQL型のシリアライゼーション(直列化)もしくはデ・シリアライゼーション(直列化複合)にともなうエラーを示します。

SQLClientInfoException extends SQLException

Connectionに設定されていない1つもしくはそれ以上のクライアント情報プロパティがあるときにスローされるSQLExceptionのサブクラスです。
SQLExceptionが提供する情報に加えて、SQLClientInfoException は設定されていないクライアント情報プロパティの一覧を提供します。
いくつかのデータベースでは複数のクライアント情報プロパティをアトミックに設定することを許しません。このようなデータベースでは、Connection.setClientInfoが例外をスローしたとしても、いくつかのクライアント情報プロパティは設定された状態となっている可能性があります。アプリケーションは、例外のgetFailedPropertiesメソッドを使用して、設定がし損じている状態のクライアント情報プロパティの一覧を取得できます。このプロパティは適切なSQLClientInfoExceptionコンストラクタにMapをパスすることで指定されたものです。

SQLNonTransientException extends SQLException

SQLException〔で示される問題が〕是正されない限り同じ処理を再実行しても失敗する場合にスローされるSQLExceptionのサブクラスです。

直接かつ既知のサブクラス:
SQLDataException, SQLFeatureNotSupportedException, SQLIntegrityConstraintViolationException, SQLInvalidAuthorizationSpecException, SQLNonTransientConnectionException, SQLSyntaxErrorException

SQLRecoverableException extends SQLException

直前に失敗した処理が、アプリケーションがいくつかのリカバリ・ステップを実行しトランザクションのすべて、もしくは──分散トランザクションの場合──トランザクション・ブランチを再試行することで成功しうるものであるという場合にスローされるSQLExceptionのサブクラスです。少なくとも、リカバリ処理は、現在の接続のクローズと新しい接続の取得とを含む必要があります。

SQLTransientException extends SQLException

直前に失敗した処理が、いかなるアプリケーション・レベルの処理の介在もなしに再実行するだけで成功しうるものである場合にスローされるSQLExceptionのサブクラスです。

直接かつ既知のサブクラス:
SQLTimeoutException, SQLTransactionRollbackException, SQLTransientConnectionException

SQLWarning extends SQLException

データベース・アクセスに関する警告の情報を提供する例外クラスです。警告はそのメソッド呼び出しにより通報すべき事項を発生させたオブジェクトに暗黙のうちに結びつけられます。

警告はConnection、Statement、そしてResultSetオブジェクトから取得することができます。クローズした後のConnectionから警告情報を取得しようとした場合、例外がスローされます。同様に、クローズ済みのStatementやResultSetから警告情報を取得しようとすると、例外がスローされます。Statementのクローズにより、そこから生成されたResultSetもまたクローズされる点に注意してください。

     * * *

原典は、Oracleが公開している“Java™ Platform, Standard Edition 7 API Specification”。

上記のほかに SyncFactoryExceptionとSyncProviderExceptionという例外もSQLExceptionの直接のサブクラスとしてドキュメントには紹介されていますが、話題について行けない感があったので、時間を節約することにしました。