【问题标题】:jdbc DB2 queryTimeout not working as expectedjdbc DB2 queryTimeout 未按预期工作
【发布时间】:2020-05-12 21:02:43
【问题描述】:

我们在 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);
        }

  • 我将超时设置为 10 秒,但根本没有超时,有人知道为什么吗?

  • 难点是Db2驱动不是开源的,无法调试,如何使用Db2解决这个问题?

【问题讨论】:

  • 是否设置了属性,是否与此处列出的案例相匹配? ibm.com/support/knowledgecenter/SSEPGG_11.5.0/…
  • IBM db2 jdbc 驱动程序支持跟踪,以允许确定问题,在 DB2 知识中心 ibm.com/support/knowledgecenter/SSEPGG_11.5.0/… 在线清楚地记录。确认您始终使用最新 jdbc4 驱动程序。通过ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads 获取。 其他事物经常发生变化,查询本身、驱动程序版本、Db2 服务器、连接机制等。这是调试而不是编程。
  • @data_henrik 感谢您的回复,您能否指出需要设置哪些属性会影响它的工作,网址列出了很多,很难说
  • setQueryTimeout 上只有一小部分
  • @mao 谢谢,您对驱动程序版本的建议对我很有帮助,我们不在 db2jcc4 上(它只是旧的 db2jcc),升级后,似乎尊重我在方法,我要确定的最后一件事是,它调用取消方法来实际取消来自服务器的查询,我将如何做到这一点,再次,缩小的源代码很难找到取消方法

标签: java tomcat jdbc db2


【解决方案1】:

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

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

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

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

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

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

  • 对于 DB2 for z/OS 上用于 JDBC 和 SQLJ 类型 2 连接的 IBM 数据服务器驱动程序,仅在以下情况下才支持 Statement.setQueryTimeout 连接或数据源属性 queryTimeoutInterruptProcessingMode 设置为 INTERRUPT_PROCESSING_MODE_CLOSE_SOCKET。

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

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

    语句.执行 Statement.executeUpdate Statement.executeQuery

  • Statement.setQueryTimeout 支持 Statement.executeBatch 仅当设置了属性 queryTimeoutInterruptProcessingMode 时的方法 到 INTERRUPT_PROCESSING_MODE_CLOSE_SOCKET (2)。

【讨论】:

  • 我之前看到 queryTimeoutInterruptProcessingMode 并在上周我还在使用 type2 驱动程序时尝试了它,但它无论如何都没有用。但是使用 type4 驱动程序,无论我是否设置模式,它似乎都可以正常工作
  • 很大程度上取决于驱动程序的确切版本,无论类型如何。将驱动程序维持在当前水平是关键。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2021-06-04
  • 2022-01-24
  • 2015-05-11
  • 2020-05-15
  • 2014-10-31
  • 2018-02-12
  • 2014-01-20
相关资源
最近更新 更多