0

JDBC接続プール コンポーネントを作成しようとしていますが、問題が発生しました。つまり、 のエラー状態を検出する方法ですjava.sql.SQLExceptionSQL2003州は文書の慣習やXOPEN SQL慣習に従うべきだと言われていJDKます。しかし、これらの 2 つの規則に関するドキュメントが見つかりません。どなたか提供していただけませんか?

すべての状態が何を表しているのかを知りたいので、いつ接続を完全に閉じるか、再接続するかを決定できます。

のソースコードを参考にしましたBoneCP。SQLException が発生したときにアクティブになる部分は次のとおりです。

    ImmutableSet<String> sqlStateDBFailureCodes = ImmutableSet.of("08001", "08007", "08S01", "57P01", "HY000"); 
    String state = e.getSQLState();
        ConnectionState connectionState = this.getConnectionHook() != null ? this.getConnectionHook().onMarkPossiblyBroken(this, state, e) : ConnectionState.NOP; 
        if (state == null){ // safety;
            state = "08999"; 
        }

        if (((sqlStateDBFailureCodes.contains(state) || connectionState.equals(ConnectionState.TERMINATE_ALL_CONNECTIONS)) && this.pool != null) && this.pool.getDbIsDown().compareAndSet(false, true) ){
            logger.error("Database access problem. Killing off all remaining connections in the connection pool. SQL State = " + state);
            this.pool.connectionStrategy.terminateAllConnections();
            this.pool.poisonAndRepopulatePartitions();
        }
char firstChar = state.charAt(0);
        if (connectionState.equals(ConnectionState.CONNECTION_POSSIBLY_BROKEN) || state.equals("40001") || 
                state.startsWith("08") ||  (firstChar >= '5' && firstChar <='9') /*|| (firstChar >='I' && firstChar <= 'Z')*/){
            this.possiblyBroken = true;
        }

        // Notify anyone who's interested
        if (this.possiblyBroken  && (this.getConnectionHook() != null)){
            this.possiblyBroken = this.getConnectionHook().onConnectionException(this, state, e);
        }

これらのコードによるとboneCP、SQLException の状態が "08001"、"08007"、"08S01"、"57P01"、"HY000" のいずれかに等しい場合、データベース サーバーのクラッシュと見なされます。

しかし、なぜ、これらの州は何を表しているのでしょうか?

4

3 に答える 3

5

最初の 2 文字は、 SQL92 仕様の「Table_23-SQLSTATE_class_and_subclass_values」で指定されています。

関連性の抜粋を次に示します。

00  success completion
01  warning
02  no data
07  dynamic SQL error
08  connection exception
0A  feature not supported
21  cardinality violation
22  data exception
23  integrity constraint violation
24  invalid cursor state
25  invalid transaction state
26  invalid SQL statement name
27  triggered data change violation
28  invalid authorization specification
2A  direct SQL syntax error or access rule violation
2B  dependent privilege descriptors still exist
2C  invalid character set name
2D  invalid transaction termination
2E  invalid connection name
33  invalid SQL descriptor name
34  invalid cursor name
35  invalid condition number
37  dynamic SQL syntax error or access rule violation
3C  ambiguous cursor name
3D  invalid catalog name
3F  invalid schema name
40  transaction rollback
42  syntax error or access rule violation
44  with check option violation
HZ  remote database access

残りの文字は DB ベンダーに依存します。startsWith()そのため、通常はチェックのみを実行することをお勧めします。

于 2013-01-18T18:30:47.470 に答える
2

SQL 標準 (ISO/IEC-9075)、具体的には book 2 Foundation は SQL 状態を定義しています。これらは、2 文字のクラス値の後に 3 文字のサブクラス値が続きます。

数字「0」、「1」、「2」、「3」、または「4」のいずれか、または単純なラテン大文字の「A」、「B」、「C」のいずれかで始まるクラス値「D」、「E」、「F」、「G」、または「H」は、ISO/IEC 9075 またはその他の国際規格で定義されている条件に対してのみ返されます。[...] これらの 13 文字のいずれかで始まるクラスに関連付けられたサブクラス値は、ISO/IEC 9075 またはその他の国際規格で定義された条件に対してのみ返されます。[...] 数字「5」、「6」、「7」、「8」、または「9」のいずれか、または単純なラテン大文字の「I」のいずれかで始まるクラスに関連付けられたサブクラス値、「J」、「K」、「L」、「M」、「N」、「O」、「P」、

数字「5」、「6」、「7」、「8」、または「9」のいずれか、または単純なラテン大文字の「I」、「J」、「K」のいずれかで始まるクラス値「L」、「M」、「N」、「O」、「P」、「Q」、「R」、「S」、「T」、「U」、「V」、「W」、「X」 '、'Y'、または 'Z' は実装定義の例外条件用に予約されており、実装定義のクラスと呼ばれます。サブクラスがないことを意味する「000」を除くすべてのサブクラス値は、そのようなクラスに関連付けられており、実装定義の条件用に予約されており、実装定義のサブクラスと呼ばれます。

(SQL:2011 book 2 より)

これらの標準クラス (および標準定義のサブクラス) は、book 2 (foundation)、3 (CLI)、4 (PSM)、9 (MED)、10 (OLB)、13 (JRT)、および 14 (XML) にリストされています。また、何かが例外、警告、正常終了条件、またはデータなし完了条件であるかどうかもリストします (すべての SQL 状態がエラーであるとは限りません!)。

たとえば、質問にリストされている sqlstates は次のとおりです。

  • 08001: クラス: 接続例外、サブクラス: SQL クライアントが SQL 接続を確立できません
  • 08007: クラス: 接続例外、サブクラス: トランザクション解決が不明
  • 08S01: クラス: 接続例外、サブクラス: S で始まるため、実装定義のサブクラスです (ODBC では通信リンク障害として定義されています)。
  • 57P01: class: 5 で始まるので、実装定義クラスです。ADMIN SHUTDOWN の PostgreSQL sqlstate のようです。
  • HY000: クラス: CLI 固有の条件 (ブック 3、CLI で定義)、サブクラス: (サブクラスなし)

HY000一部のデータベースまたはドライバーは、特定の sqlstate を持たないエラーに対してそれを返すため、非常に一般的なエラーであるため、通常は致命的なエラーとして扱われます。私は、BoneCP の動作を、接続プール全体を強制終了する理由として扱うようにしています。これHY000は、比較的無害なエラーでもスローされる可能性があるためです。その他の sqlstates は、通常、データベースへの接続の問題 ( 0800108S01)、データベースが使用できないこと ( 57P01)、またはデータベース自体の問題 ( 08007) を示しています。

于 2013-01-19T09:28:06.180 に答える
0

ステータスコードの説明へのリンクは、文字通り、あなたが参照したのと同じコードブロックにあります: https://github.com/wwadge/bonecp/blob/master/bonecp/src/main/java/com/jolbox/bonecp/ConnectionHandle.java #L163

于 2013-01-28T15:01:24.590 に答える