JDBC
接続プール コンポーネントを作成しようとしていますが、問題が発生しました。つまり、 のエラー状態を検出する方法ですjava.sql.SQLException
。SQL2003
州は文書の慣習や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" のいずれかに等しい場合、データベース サーバーのクラッシュと見なされます。
しかし、なぜ、これらの州は何を表しているのでしょうか?