Pergunta

Eu estou querendo saber como as classes JBoss ExceptionSorter são capazes de verificar se há erros de banco de dados.

A aplicação (quadro EJB ou persistência) está segurando a referência para a conexão de banco de dados, de modo SQLExceptions são capturados pela aplicação. Como é JBoss capaz de ver o conteúdo da exceção?

O JBoss envolver a conexão e interceptar essas mensagens ou algo assim?

Foi útil?

Solução

Se você já executar um depurador contra o código em execução dentro JBoss, enquanto que que tenha uma conexão de banco de dados aberto, você vai notar que a conexão é realmente uma classe específica de JBoss que envolve a conexão de banco de dados real.

Em alguns casos, você pode ver esse wrapper como uma linha no rastreamento de pilha quando uma exceção é lançada pelo banco de dados, como uma exceção de sintaxe SQL. Veja última linha no exemplo abaixo:

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)

Eu imagino que esse wrapper pode fornecer a exceção-inspeção você sugeriu.

Outras dicas

JBoss usa um pool de conexão para suas fontes de dados (org.jboss.resource.adapter.jdbc.local.LocalTxDataSource). O ExceptionSorter leva uma SQLException como um parâmetro que então apenas verifica a existência de determinadas seqüências que mapeiam para certos erros. Se os erros representam um problema de conexão física, então eles vão olhar um pouco como "erro de soquete" ou "pipe quebrado".

Esta excepção Sorter irá retornar um valor booleano que representa o estado da volta conexão com o pool de conexão que irá invalidar e remover quaisquer conexões que retornaram falsa.

Para um banco de dados Oracle:

<property name="exceptionSorterClassName"><value>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</value></property>

Este trabalho irá para um banco de dados Oracle. Aqui está o código para que a implementação ExceptionSorter:

http://kickjava.com /src/org/jboss/resource/adapter/jdbc/vendor/OracleExceptionSorter.java.htm

Como a programação interna de onde ou como o pool de conexão verifica a conexão é desconhecido para mim. Verifique o código fonte JBoss.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top