我想知道JBoss ExceptionSorter类如何能够检查数据库错误。

应用程序(EJB或持久性框架)持有对数据库Connection的引用,因此应用程序捕获了SQLExceptions。 JBoss如何看到异常的内容?

JBoss是否包装了连接并拦截了这些消息或类似的东西?

有帮助吗?

解决方案

如果您对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)

我想这个包装器可能会提供你建议的异常检查。

其他提示

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源代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top