Come funzionano le classi ExceptionSorter in JBoss?
-
03-07-2019 - |
Domanda
Mi chiedo come le classi JBoss ExceptionSorter siano in grado di verificare la presenza di errori nel database.
L'applicazione (EJB o framework di persistenza) contiene il riferimento alla connessione al database, quindi l'applicazione SQLExceptions viene catturata. In che modo JBoss è in grado di vedere il contenuto dell'eccezione?
JBoss chiude la connessione e intercetta questi messaggi o qualcosa del genere?
Soluzione
Se hai mai eseguito un debugger contro il codice in esecuzione all'interno di JBoss, mentre quello che ha una connessione al database aperta, noterai che la connessione è in realtà una classe specifica di JBoss che avvolge la connessione al database reale.
In alcuni casi, è possibile visualizzare questo wrapper come una riga nella traccia dello stack quando viene generata un'eccezione dal database, ad esempio un'eccezione di sintassi SQL. Vedi l'ultima riga nell'esempio seguente:
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)
Immagino che questo wrapper possa fornire l'ispezione delle eccezioni da te suggerita.
Altri suggerimenti
JBoss utilizza un pool di connessioni per le sue origini dati (org.jboss.resource.adapter.jdbc.local.LocalTxDataSource). ExceptionSorter accetta SQLException come parametro che controlla quindi solo per determinate stringhe che associano a determinati errori. Se gli errori rappresentano un problema di connessione fisica, appariranno in qualche modo simili a "Errore socket" o "tubo rotto".
Questo separatore di eccezioni restituirà quindi un valore booleano che rappresenta lo stato della connessione al pool di connessioni che invaliderà e rimuoverà tutte le connessioni restituite false.
Per un database Oracle:
<property name="exceptionSorterClassName"><value>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</value></property>
Funzionerà con un database Oracle. Ecco il codice per l'implementazione di ExceptionSorter:
http://kickjava.com /src/org/jboss/resource/adapter/jdbc/vendor/OracleExceptionSorter.java.htm
Come la programmazione interna di dove o come il pool di connessioni controlla la connessione non mi è nota. Controlla il codice sorgente di JBoss.