Question

Je me demande comment les classes JBoss ExceptionSorter peuvent vérifier les erreurs de base de données.

L’application (EJB ou cadre de persistance) contient la référence à la connexion à la base de données, ainsi les exceptions SQLExceptions sont interceptées par l’application. Comment JBoss peut-il voir le contenu de l'exception?

Est-ce que JBoss encapsule la connexion et intercepte ces messages ou quelque chose du genre?

Était-ce utile?

La solution

Si vous avez déjà exécuté un débogueur avec un code exécuté dans JBoss, alors que celui-ci a une connexion de base de données ouverte, vous remarquerez que la connexion est en fait une classe spécifique à JBoss qui encapsule la connexion à la base de données réelle.

Dans certains cas, vous pouvez voir ce wrapper comme une ligne dans la trace de la pile lorsqu'une exception est générée par la base de données, telle qu'une exception de syntaxe SQL. Voir la dernière ligne de l'exemple ci-dessous:

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)

J'imagine que cette enveloppe peut fournir l'inspection par exception que vous avez suggérée.

Autres conseils

JBoss utilise un pool de connexions pour ses sources de données (org.jboss.resource.adapter.jdbc.local.LocalTxDataSource). ExceptionSorter prend une exception SQLException en tant que paramètre, puis vérifie uniquement certaines chaînes qui mappent certaines erreurs. Si les erreurs représentent un problème de connexion physique, elles ressembleront un peu à " Erreur de socket " ou "tuyau cassé".

Cette trieuse d'exceptions renverra ensuite une valeur booléenne représentant l'état de la connexion au pool de connexions, qui sera ensuite invalidée et supprimera toutes les connexions ayant renvoyé la valeur false.

Pour une base de données Oracle:

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

Cela fonctionnera pour une base de données Oracle. Voici le code de cette implémentation ExceptionSorter:

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

Je ne connais pas comment la programmation interne de où ou comment le pool de connexions vérifie la connexion. Vérifiez le code source de JBoss.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top