IBM i (System i) V7R1 升级导致 ODBC 连接上出现 cursor not open 错误

IBM i (System i) V7R1 upgrade causes cursor not open errors on ODBC connection

多年来,至少 8 年来,我们公司一直 运行每天都在进行一个从未失败的过程。客户端没有任何变化,但我们最近在 System i 上升级到 V7R1。旧进程的第一个 运行 失败,并向客户端报告 Cursor not open 消息,这也是作业日志中的全部内容。我有时看到错误 -501,SQLSTATE 24501。

我让 IBM 和 DataDirect(ODBC 驱动程序的提供商)参与进来。 IBM 表示这是一个客户端问题,DataDirect 通过日志挖掘发现当从游标请求下一个记录块时会发生此错误。他们没有看到 System i 提醒客户游标已关闭的迹象。

在故障排除中,我注意到 ODBC 驱动程序有一个 WITH HOLD 选项,默认情况下它是选中的。如果我取消选中它,这个特定问题就会消失,但它会引入另一个更严重的问题(无限循环)。

没有一个共同的主题会导致这些错误,我看到的唯一导致此错误的原因是在循环访问相当大的结果集时进行一些处理。它似乎与时间或特定的 table 或 table 类型无关。外部循环有时很大 tables 有很多数据类型,有时很小 tables 只有 CHAR(10) 和 CHAR(8) 数据类型。

我真的不希望在这里得到答案,因为这是一个非常深奥的情况,但总有一些希望。

IBM 已经通过让我们应用 PTF 将我们带到数据库级别的 36 来解决其他问题。我绝不是 System i 专家,只是一个 Java 程序员,必须处理这个与 Java 完全无关的问题。

谢谢

这就是我在 iseries 上解决数据库问题的方法。

开始记录 iseries 上的 tables 或更改与 iseries 的连接以提交 = *NONE.

对于日记,我建议使用两个日记本,每个日记本都有自己的接收器。

一份 table 的期刊,变化相对较少,例如 table 美国各州或 table 每个月更新不到 10 次。这样您就可以确定数据何时更改以进行审核。让本期刊的所有接收者永远在线。

一本日记 table 天,每天都有很多变化。当您负担不起 space 它们占用的费用时,请删除这些期刊的接收器。

如果日志或提交 *none 没有修复它。您需要查看 sysixadv table 长 运行 查询会破坏 ODBC 连接。

SELECT SYS_TNAME, TBMEMBER, INDEX_TYPE, LASTADV, TIMESADV, ESTTIME, 原因,"PAGESIZE",QUERYCOST,QUERYEST,TABLE_SIZE,NLSSNAME,
NLSSDBNAME、MTIUSED、MTICREATED、LASTMTIUSE、QRYMICRO、EVIVALS,
FIRSTADV、SYS_DNAME、MTISTATS、LASTMTISTA、DEPCNT FROM sysixadv
按 ESTTIME desc

排序

也按时间排序adv desc

修复这些查询可能会创建建议的索引。

您使用的是哪个 ODBC 驱动程序?

如果您使用的是 IBM i Access ODBC 驱动程序,则此问题可能会被 APAR SE61342 修复。驱动程序并不总是处理来自服务器的指示结果集已关闭的 return 代码,并且在 SQLCloseCursor 函数期间,驱动程序将向服务器发送关闭命令,这将 return错误,因为服务器已经关闭游标。请注意,您不必达到 SP11 即可达到此条件,它只是使它更容易达到,因为我在该修复包中的更多情况下启用了预取。一个简单的测试来查看这是否是问题所在,即禁用 DSN 的预取或在连接字符串上传递 PREFETCH=0。

如果您使用的是 DB2 Connect 驱动程序,我真的无法提供太多帮助,抱歉。

这适用于可能 运行 遇到类似问题的任何其他人。事实证明,是 QRWTSRVR 代码中的一个错误导致了这个问题。驱动程序在单个作业中打开了多个连接,并在其中至少两个连接中对游标使用了相同的名称。一旦这些游标之一关闭,QRWTSRVR 将错误地尝试使用已关闭的游标并 return 错误。以下是 PTF 求职信中的描述:

APAR SE62670 修复的问题描述:

    A QRWTSRVR job with 2 cursors named C01 takes a MSGSQL0501
error when trying to fetch from the one that is open. The DB2
code is trying to use the cursor which is pseudo closed.

PTF SI57756 解决了这个问题。我不知道这个 PTF 是否会普遍发布,但如果你发现这个 post 因为类似的问题,希望这能帮助你更正它。