【问题标题】:How do the ExceptionSorter classes in JBoss work?JBoss 中的 ExceptionSorter 类是如何工作的?
【发布时间】:2010-09-18 03:25:18
【问题描述】:

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

应用程序(EJB 或持久性框架)持有对数据库连接的引用,因此应用程序会捕获 SQLExceptions。 JBoss 怎么能看到异常的内容?

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

【问题讨论】:

    标签: jboss database-connection


    【解决方案1】:

    JBoss 为其数据源 (org.jboss.resource.adapter.jdbc.local.LocalTxDataSource) 使用连接池。 ExceptionSorter 将 SQLException 作为参数,然后它只检查映射到某些错误的某些字符串。如果错误代表物理连接问题,那么它们看起来有点像“Socket error”或“broken pipe”。

    然后,此异常排序器会将表示连接状态的布尔值返回给连接池,该连接池随后将使所有返回 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 源代码。

    【讨论】:

      【解决方案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)
      

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

      【讨论】:

        猜你喜欢
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        相关资源
        最近更新 更多