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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top