Вопрос

Мне интересно, как классы JBoss ExceptionSorter могут проверять ошибки базы данных.

Приложение (EJB или постоянная структура) содержит ссылку на соединение с базой данных, поэтому SQLExceptions перехватывается приложением. Как JBoss может видеть содержимое исключения?

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)

Полагаю, эта оболочка может обеспечить проверку исключений, которую вы предложили.

Другие советы

JBoss использует пул соединений для своих источников данных (org.jboss.resource.adapter.jdbc.local.LocalTxDataSource). ExceptionSorter принимает SQLException в качестве параметра, который затем просто проверяет определенные строки, которые отображаются на определенные ошибки. Если ошибки представляют собой проблему физического соединения, они будут выглядеть как «Ошибка сокета». или "сломанная труба".

Затем этот сортировщик исключений вернет логическое значение, представляющее состояние соединения, обратно в пул соединений, который затем сделает недействительным и удалит все соединения, которые вернули 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top