このセクションでは、Oracle互換アプリケーションのエラー処理規範について説明します。
OceanBaseデータベースはV2.0バージョンからOracleデータベースとの完全な互換性を提供し、Oracle互換テナントモードをサポートしています。エラーコードについては、エラーコード、SQLSTATE、エラーメッセージの3つの情報がOracleデータベースと可能な限り一致するようにしています。そのため、製品設計の原則として、アプリケーションのエラー処理規範はOracleデータベースの処理規範を参考にすることができます。ただし、分散型データベースとして、OceanBaseデータベースは集中型のOracleデータベースとは本質的に異なり、分散環境特有の一部のエラーはOracleデータベースのエラーコードでは表現できません。そのため、このような内部エラーコードはエラーコード OBE-00600 にマッピングされ、OceanBaseデータベース固有のエラーコードであることを示しています。
OceanBaseデータベースのOracleテナントモードでは、エラーメッセージの形式はOracleデータベースと互換性があり、「プレフィックス + 数字コード」の形式で返されます。エラーがSQLに起因する場合は ORA で始まるエラーメッセージが返され、エラーがストアドプロシージャに起因する場合は PLS で始まるエラーメッセージが返されます。OceanBaseデータベースサーバー側のOracleテナントモードにおける完全なエラーコード一覧については、エラー情報の概要を参照してください。
OBE-00600 エラーコードについては、アプリケーションはエラーメッセージから具体的な内部エラーコードを抽出する必要があります。例えば、以下のエラーメッセージでは、内部エラーコードは 6210 です。
OBE-00600: internal error code, arguments: -6210, Transaction timeout occurred, please rollback the transaction, set the variable ob_trx_timeout to a larger value and then restart the transaction
エラーコード情報の取得
各言語のドライバーは、エラー情報を取得するための異なるAPIを提供しています。各ドライバーの詳細については、接続方法の概要の ドライバー セクションを参照してください。
Javaドライバーライブラリ
JDBCを使用するJavaアプリケーションがSQLステートメントの実行に失敗した場合、SQLException例外をキャッチできます。この例外には、エラーコード、SQLSTATE、エラーメッセージの3種類の情報が含まれています。SQLException例外の詳細については、JDBC APIドキュメントを参照してください。
SQLException例外をキャッチする方法は以下のとおりです:
- getErrorCode() を呼び出してエラーコードを取得します。
- getSQLState() を呼び出してSQLSTATEを取得します。
- getMessage() を呼び出してエラーメッセージを取得します。
OBCIドライバーライブラリ
OBCIは、Oracle OCIと互換性のあるC言語のドライバーライブラリを提供しています。関数呼び出しが OCI_ERROR を返した場合、アプリケーションは関数 OCIErrorGet() の出力パラメータを通じてエラー情報を取得します:
- 出力パラメータ errcodep を通じてエラーコードを取得します。
- 出力パラメータ sqlstate を通じてSQLSTATEを取得します。
- 出力パラメータ bufp を通じてエラーメッセージを取得します。
エラー処理の規範
OceanBaseデータベースのOracleテナントモードにおけるほとんどのエラーコードについては、アプリケーションが特別な処理を行う必要はなく、直接外部にエラーを報告できます。フォールトトレランスとアプリケーションの堅牢性を高めるために、特定のエラーコードについては、異なるシナリオやエラーの性質に応じて、以下の4つの異なるポリシーを採用できます:
ポリシー1:ステートメントのタイプに基づいて処理します。
SELECTステートメントの実行時にタイムアウトエラーが発生した場合、副作用がないため、再試行できます。リモートまたは分散実行による
UPDATEなどの変更ステートメントでタイムアウトエラーが発生した場合、ステートメントが実際に実行されたかどうかは不確定であるため、トランザクションをロールバックする必要があります(変更ステートメントのセマンティクスが冪等である場合、そのステートメントを再試行できます)。COMMITまたはROLLBACKステートメントの実行時にタイムアウトエラーが発生した場合、トランザクションの状態が不明であるため、直接外部にエラーを報告する必要があります。
ポリシー2:任意のステートメントの実行でエラーが発生した場合、現在のトランザクションをロールバックしてから、トランザクションを再試行します。
ポリシー3:任意のステートメントの実行でエラーが発生した場合、現在のステートメントを再試行します。
ポリシー4:任意のステートメントの実行でエラーが発生した場合、現在の接続を閉じてから、接続を再確立します。
特に、開発習慣により、OCIインターフェースを使用して開発された多くのサービス系アプリケーションは長い接続を使用します。データベースサーバー側でランタイム例外が発生し、処理されない場合、サービスが自動的に回復できない可能性があります。このようなアプリケーションでは、以下の OceanBaseデータベース固有のエラーコード および Oracle互換エラーコード の推奨に従ってエラー処理を行う必要があります。
OceanBaseデータベース固有のエラーコード
以下のエラーコードは、一般的なOceanBaseデータベースサーバー固有のランタイム例外のエラーコードです。下表の異なる「内部エラーコード」に基づき、アプリケーションは「処理ポリシー」の推奨に従って処理を行うことができます。
エラーコード |
内部エラーコード |
意味 |
ステートメント実行結果 |
トランザクション状態 |
対処方針 |
|---|---|---|---|---|---|
| OBE-00600 | 4012 | 実行タイムアウト | 不明 | 未知 | プラン1 |
| OBE-00600 | 4038 | 現在のレプリカがリーダーレプリカではないため、サービスを提供できません。一般的にレプリカのリーダー切り替え時に発生する可能性があります。 | 失敗 | 変更なし | プラン3 |
| OBE-00600 | 4225 | パーティションが存在しません。一般的にレプリカの移行時に発生する可能性があります。 | 失敗 | 変更なし | プラン3 |
| OBE-00600 | 6210 | トランザクション実行が制限時間を超えました | 失敗 | 変更なし | プラン2 |
| OBE-00600 | 6231 | レプリカデータが読み取り不可です。一般的にレプリカの移行時に発生する可能性があります。 | 失敗 | 変更なし | プラン3 |
| OBE-00600 | 8001~8004 | 接続が回復不能です | 失敗 | 未知 | プラン4 |
注意
OBE-00600 エラーコードについては、アプリケーションはエラーメッセージから具体的な内部エラーコードを抽出する必要があります。以下のフォーマット文字列を使用して、プレースホルダー `%d` の位置にある整数を抽出すると、それが内部エラーコードになります。
OBE-00600: internal error code, arguments: %d
Oracle互換エラーコード
一般的なOracleデータベース互換のエラーコードについては、Oracleデータベースと同じ処理方法を遵守してください。特に、以下のエラーコードはOceanBaseデータベースのOracleテナントモードでよく見られる異常であり、アプリケーションは下表の「処理ポリシー」の推奨に従って処理できます。
エラーコード |
意味 |
ステートメント実行結果 |
トランザクションステータス |
対処方法 |
|---|---|---|---|---|
| OBE-01555 | 読み取ったスナップショットバージョンが古すぎます | 失敗 | 変更なし | ポリシー3 |
| OBE-24761 | トランザクションがシステム内部でロールバックされました | 失敗 | ロールバック済み | ポリシー2 |
| OBE-08177 | 現在のトランザクションを直列化できません。通常はRR(Repeatable Read)およびSerializable分離レベルでトランザクションの並行競合が発生した場合に起こります。 トランザクション分離レベルの詳細については、トランザクション分離レベルの概要を参照してください。 |
失敗 | 変更なし | ポリシー2 |
OBCIを使用するアプリケーションの場合、ドライバー側は一部のOracleデータベース互換のエラーコードを返します。これらもOracleデータベースと同じ処理方法に従います。特に、アプリケーションは以下のエラーコードに注意する必要があります。
エラーコード |
意味 |
対処方法 |
|---|---|---|
| OBE-03113 | サーバーとの接続が切断されました | 接続を再確立します |
| OBE-01403 | 期待される行数が返された結果の行数を超えています | エラーを報告するか、アプリケーションのロジックが正しいかどうか確認します |
| OBE-01405 | 列の値がNULLです | NULL値の問題を処理します |
| OBE-01406 | 返された結果がバッファ長を超えています | データ受信用バッファの長さを増やします |