2008-10-20 20 views
3

我想知道JBoss ExceptionSorter類是如何檢查數據庫錯誤的。JBoss中的ExceptionSorter類如何工作?

的應用程序(EJB或持久性框架)握持參照數據庫連接,所以SQLExceptions的由應用程序捕獲。 JBoss如何能夠看到異常的內容?

是否JBoss的包裹連接和攔截這些消息或類似的東西?

回答

2

如果你曾經對運行在JBoss運行的代碼調試器,而有一個開放的數據庫連接,你會發現,連接實際上是包裝了真正的數據庫連接特定的JBoss類。

在某些情況下,你可以看到這個包裝作爲堆棧跟蹤線時異常是由數據庫拋出,如SQL語法異常。請參閱下面示例中的最後一行:

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) 

我想象這個包裝可能會提供您建議的異常檢查。

+1

哇,我什至不記得問這個問題! – 2012-11-28 00:36:32

3

JBoss使用其數據源(org.jboss.resource.adapter.jdbc.local.LocalTxDataSource)的連接池。 ExceptionSorter將SQLException作爲一個參數,然後它僅檢查映射到某些錯誤的某些字符串。如果錯誤代表物理連接問題,那麼它們看起來有點像「套接字錯誤」或「斷開的管道」。然後

這個異常分揀機將返回一個表示連接的狀態恢復到連接池,然後將廢止和刪除返回false任何連接一個布爾值。

對於Oracle數據庫:

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

這將會爲Oracle數據庫工作。以下是一個ExceptionSorter執行代碼:

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

如何的在哪裏以及如何連接池檢查連接的內部編程是未知的我。檢查JBoss源代碼。