首页 > 解决方案 > jdbc DB2 queryTimeout 未按预期工作

问题描述

我们在 Db2 上遇到了查询超时属性的问题,当我们在 WebSphere 中运行应用程序时它正在工作,然后我们转移到 Tomcat,这个问题最近被一个非常长的查询所困扰,该查询在 45 之后挂起很长时间直到超时分钟,我们拥有的一些代码如下,自从迁移到 Tomcat 之后,它们就没有改变过:

    CallableStatement cs = statementFactory.createCallableStatement(getConnection(), source.getSQL(),
                statementConfig);
    cs.setQueryTimeout(10);
    boolean resultSetAvailable = cs.execute();
    if (resultSetAvailable) {
            resultSet = cs.getResultSet();
        } else {
            resultSet = CallableStatementParamsUtils.checkForOutResultSet(cs, storedProc);
        }

标签: javatomcatjdbcdb2

解决方案


在这种情况下,使用 jdbc 类型 4 驱动程序似乎有助于解决问题。

请注意,IBM db2 jdbc 驱动程序支持跟踪以确定问题,如此所述。

在使用 Db2 处理 jdbc 问题时,确保您使用的是最新的 jdbc 驱动程序总是有帮助的,该驱动程序可通过此页面获得。

从评论来看,之前的 jdbc 驱动是 type-2 驱动(它只支持特定配置的查询超时,如 DB2 知识中心的 IBM 文档,注释复制如下)。

此页面上有关 jdbc 中的 queryTimeout 支持的各种 IBM 注释是必不可少的阅读材料,即:

  • 对于 DB2 for i,此方法 (setQueryTimeout) 仅支持秒值 0。

  • 对于 DB2 for z/OS 上用于 JDBC 和 SQLJ 类型 2 连接的 IBM Data Server Driver,仅当 Connection 或 DataSource 属性 queryTimeoutInterruptProcessingMode 设置为 INTERRUPT_PROCESSING_MODE_CLOSE_SOCKET 时才支持 Statement.setQueryTimeout。

  • 对于 Linux、UNIX 和 Windows 系统上 Db2 上用于 JDBC 和 SQLJ 类型 2 连接的 IBM Data Server Driver,仅当 Connection 或 DataSource 属性 queryTimeoutInterruptProcessingMode 设置为 INTERRUPT_PROCESSING_MODE_STATEMENT_CANCEL 时才支持 Statement.setQueryTimeout。

  • 对于 IBM Data Server Driver for JDBC and SQLJ 版本 4.0 及更高版本,以下方法支持 Statement.setQueryTimeout:

    Statement.execute Statement.executeUpdate Statement.executeQuery

  • 仅当属性 queryTimeoutInterruptProcessingMode 设置为 INTERRUPT_PROCESSING_MODE_CLOSE_SOCKET (2) 时,Statement.executeBatch 方法才支持 Statement.setQueryTimeout。


推荐阅读