警告 - 获取导入键失败游标先前已被释放且不可用

WARN - Failed to getImportedKeys The cursor has been previously released and is unavailable

我 运行 SchemaSpy v6.1.0-SNAPSHOT 在相当庞大的 Informix 12.10 模式上,我收到错误 "WARN - Failed to getImportedKeys The cursor has been previously released and is unavailable."

我对 Java 一无所知,但我注意到 Liquibase(也是用 Java 编写的)有一个非常相似的错误,我想知道:

  1. 是否有人可以告诉我导致此错误的原因以及如何避免/解决它,因为我不是特别想学习 Java :-)
  2. 这是特定于 Informix 的还是其他数据库也有?

您在 How do I use --logLevel in Liquibase 中的 liquidbase 堆栈跟踪实际上给了我们一个提示,但我花了一些时间才弄清楚 可能 发生了什么。在那里我们可以看到 liquibase 使用缓存的结果集。缓存结果集(游标)是危险的,因为 Informix JDBC 驱动程序不会在提交时保留游标。因此,软件打开结果集(游标)很有可能做了一些其他操作,导致 Informix/JDBC 关闭游标,然后它尝试使用导致错误的已经关闭的游标。

有一个 API 强制 JDBC 保持游标打开: connection.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT)

但我猜你没有能力在这些产品中影响它来尝试它。 Informix 遗憾地不允许在 URL 中进行此设置。应该添加的功能:)

我针对我的一个数据库(22 个表,126 列)针对 schemaspy 进行了测试,最新的 Informix JDBC 驱动程序 4.10.JC12W1 没有任何问题。确切的问题可能需要重现以供支持团队确定。

我想这次我真的答对了。我不得不得到一些帮助来追踪这个,因为它是一个时间问题 + 驱动程序中的错误。

此处的问题与 Informix JDBC 驱动程序的某些版本有关。快速修复是升级到最新的 4.50.1 驱动程序。它在 maven 上。

<!-- https://mvnrepository.com/artifact/com.ibm.informix/jdbc -->
<dependency>
    <groupId>com.ibm.informix</groupId>
    <artifactId>jdbc</artifactId>
    <version>4.50.1</version>
</dependency>

详细。 4.10.X 驱动程序引入了一个语句清理器线程,该线程每 15 秒运行一次,并查找需要关闭的资源,因为它们没有更多的引用并且可以被垃圾收集。这个问题,然后复合为一对 JDBC 元数据调用错误地无法关闭资源导致这个更干净的线程有时在工作中间关闭资源。因此,有些人经常看到它,有些人从来没有。您可以使用 4.10.JC12 来解决这个问题,我们在其中添加了一个连接标志以禁用更清洁的线程 (IFMXCONNECTION_CLEANER_THREADS=0)。或者最好的选择是升级到最新的 4.50.1 驱动程序,该驱动程序已正确解决此问题。