我在一个相当庞大的Informix 12.10架构上运行SchemaSpy v6.1.0-SNAPSHOT,我收到错误“WARN - 无法获取getImportedKeys光标先前已被释放且不可用”。
我对Java一无所知,但我注意到Liquibase(也是用Java编写)的一个非常类似的错误,我想知道:
你在How do I use --logLevel in Liquibase的液体基础堆栈跟踪实际上给了我们一个提示,但是花了一些时间来研究可能发生的事情。在那里我们可以看到liquibase使用缓存的结果集。缓存ResultSet(游标)是危险的,因为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 metdata调用错误地无法关闭资源导致这个更干净的线程有时在工作中间关闭资源。因此有些人经常看到它,有些人从不看。您可以使用4.10.JC12解决它,我们添加了一个连接标志来禁用更清洁线程(IFMXCONNECTION_CLEANER_THREADS = 0)。或者最好的选择是升级到最新的4.50.1驱动程序,该驱动程序已正确修复此问题。