我在一个相当大的 Informix 12.10 模式上运行 SchemaSpy v6.1.0-SNAPSHOT,我收到错误“WARN - 无法获取导入密钥游标之前已被释放且不可用。”
我对Java一无所知,但我注意到Liquibase(也是用Java编写的)有一个非常相似的错误,我想知道:
- 鉴于我不是特别想学习 Java,是否有人可以告诉我导致此错误的原因以及如何避免/解决它:-)
- 这是特定于 Informix 的,还是在其他数据库中也可以看到?
您在如何在 Liquibase 中使用 --logLevel 中的liquidbase 堆栈跟踪实际上给了我们一个提示,但我花了一段时间才弄清楚可能发生的事情。在那里我们可以看到使用缓存结果集的 liquibase。缓存 ResultSets(游标)是危险的,因为 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 驱动程序。