Pregunta

Me pregunto cómo las clases de JBoss ExceptionSorter pueden verificar errores en la base de datos.

La aplicación (el EJB o el marco de persistencia) contiene la referencia a la conexión de la base de datos, por lo que la aplicación captura las SQLExceptions. ¿Cómo puede JBoss ver el contenido de la excepción?

¿JBoss ajusta la conexión e intercepta estos mensajes o algo así?

¿Fue útil?

Solución

Si alguna vez ejecutó un depurador contra el código que se ejecuta dentro de JBoss, mientras que eso tiene una conexión de base de datos abierta, notará que la conexión es en realidad una clase específica de JBoss que envuelve la conexión de base de datos real.

En algunos casos, puede ver este contenedor como una línea en el seguimiento de la pila cuando la base de datos lanza una excepción, como una excepción de sintaxis SQL. Vea la última línea en el ejemplo a continuación:

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)

Me imagino que esta envoltura puede proporcionar la inspección de excepción que sugirió.

Otros consejos

JBoss utiliza un grupo de conexiones para sus fuentes de datos (org.jboss.resource.adapter.jdbc.local.LocalTxDataSource). El ExceptionSorter toma una SQLException como un parámetro que luego solo busca ciertas cadenas que se asignan a ciertos errores. Si los errores representan un problema de conexión física, entonces se parecerán a " Error de socket " o " tubo roto " ;.

Este clasificador de excepciones luego devolverá un valor booleano que representa el estado de la conexión a la agrupación de conexiones, lo que luego invalidará y eliminará cualquier conexión que devolviera falso.

Para una base de datos Oracle:

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

Esto funcionará para una base de datos Oracle. Aquí está el código para esa implementación de ExceptionSorter:

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

La forma en que la programación interna de dónde o cómo el grupo de conexiones comprueba la conexión es desconocida para mí. Compruebe el código fuente de JBoss.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top