JBossExceptionSorterクラスがデータベースエラーをチェックする方法を知りたいです。
アプリケーション(EJBまたは永続フレームワーク)はデータベース接続への参照を保持しているため、SQLExceptionsはアプリケーションによってキャッチされます。JBossはどのようにして例外の内容を確認できますか?
JBossは接続をラップし、これらのメッセージまたはそのようなものをインターセプトしますか?
JBossExceptionSorterクラスがデータベースエラーをチェックする方法を知りたいです。
アプリケーション(EJBまたは永続フレームワーク)はデータベース接続への参照を保持しているため、SQLExceptionsはアプリケーションによってキャッチされます。JBossはどのようにして例外の内容を確認できますか?
JBossは接続をラップし、これらのメッセージまたはそのようなものをインターセプトしますか?
JBoss は、そのデータソース (org.jboss.resource.adapter.jdbc.local.LocalTxDataSource) に接続プールを使用します。ExceptionSorter は SQLException をパラメーターとして取り、特定のエラーにマップされる特定の文字列をチェックします。エラーが物理的な接続の問題を表している場合は、「ソケット エラー」または「壊れたパイプ」のように見えます。
この Exception Sorter は、接続の状態を表すブール値を接続プールに返します。接続プールは、false を返した接続を無効にして削除します。
Oracle データベースの場合:
<property name="exceptionSorterClassName"><value>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</value></property>
これは、Oracle データベースで機能します。その ExceptionSorter 実装のコードは次のとおりです。
http://kickjava.com/src/org/jboss/resource/adapter/jdbc/vendor/OracleExceptionSorter.java.htm
接続プールが接続をチェックする場所または方法の内部プログラミングがどのように行われるかは、私にはわかりません。JBoss のソース コードを確認します。
JBoss 内で実行されているコードに対してデバッガーを実行したことがある場合、データベース接続が開いている場合、その接続は実際には、実際のデータベース接続をラップする JBoss 固有のクラスであることに気付くでしょう。
場合によっては、SQL 構文例外などの例外がデータベースによってスローされたときに、このラッパーがスタック トレースの行として表示されることがあります。以下の例の最後の行を参照してください。
java.sql.SQLException: ORA-00942: table or view does not exist
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:810)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:850)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1134)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3384)
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:342)
このラッパーは、あなたが提案した例外検査を提供する可能性があると思います。