Как работают классы ExceptionSorter в JBoss? - PullRequest
3 голосов
/ 20 октября 2008

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

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

JBoss оборачивает соединение и перехватывает эти сообщения или что-то в этом роде?

Ответы [ 2 ]

3 голосов
/ 11 декабря 2008

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.

2 голосов
/ 28 ноября 2012

Если вы когда-либо запускали отладчик для кода, работающего внутри 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)

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

...