SchemaSpy - 生成报告时出现错误消息

SchemaSpy - Error message while generating the report

我正在使用 SchemaSpy (5.0.0) 生成我们的 Informix 数据库的报告。 虽然 运行 它在 'Gathering schema details' 的最后一步出现以下错误:

java.sql.SQLException: The cursor has been previously released and is unavailable.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:408)
    at com.informix.jdbc.IfxSqli.addException(IfxSqli.java:3187)
    at com.informix.jdbc.IfxSqli.receiveError(IfxSqli.java:3467)
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2378)
    at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2303)
    at com.informix.jdbc.IfxSqli.executeFetch(IfxSqli.java:2037)
    at com.informix.jdbc.IfxSqli.getaRow(IfxSqli.java:4077)
    at com.informix.jdbc.IfxResultSet.next(IfxResultSet.java:494)
    at com.informix.jdbc.IfxDatabaseMetaData.getImportedKeys(IfxDatabaseMetaData.java:5524)
    at net.sourceforge.schemaspy.model.Table.connectForeignKeys(Table.java:106)
    at net.sourceforge.schemaspy.model.Database.connectTables(Database.java:984)
    at net.sourceforge.schemaspy.model.Database.<init>(Database.java:83)
    at net.sourceforge.schemaspy.SchemaAnalyzer.analyze(SchemaAnalyzer.java:211)
    at net.sourceforge.schemaspy.Main.main(Main.java:42)
Caused by: java.sql.SQLException
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:408)
    at com.informix.jdbc.IfxSqli.receiveError(IfxSqli.java:3472)

我正在使用 4.1.0 版的 Informix JDBC 驱动程序(也尝试过 4.10.8.1)。奇怪的是这个驱动还需要BSON库。

知道问题出在哪里吗?

为了将来参考,我可以通过将上述驱动程序 4.X 替换为旧版本来解决问题。似乎驱动程序有问题或 SchemaSpy 与较新的 4.X 驱动程序不兼容。工作的驱动程序是最新的 3.X 驱动程序(确切地说是 3.70.JC8)。

100% 同意乔纳森的观点。这应该报告给 IBM 技术支持。 IBM 每年发布大约 3 个或 Fixpack,我认为 Informix 12.10 用户没有理由受到惩罚。打开服务请求会很棒。我爱 schemaSpy!

埃里克

查看堆栈,当客户端尝试检索主键列表时,服务器无法执行 select 和 returns 错误:

java.sql.SQLException: The cursor has been previously released and is unavailable.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:408)
    at com.informix.jdbc.IfxSqli.addException(IfxSqli.java:3187)
    at com.informix.jdbc.IfxSqli.receiveError(IfxSqli.java:3467)    <--- means error ;)
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2378)
    at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2303)
    at com.informix.jdbc.IfxSqli.executeFetch(IfxSqli.java:2037)
    at com.informix.jdbc.IfxSqli.getaRow(IfxSqli.java:4077)
    at com.informix.jdbc.IfxResultSet.next(IfxResultSet.java:494)
    at com.informix.jdbc.IfxDatabaseMetaData.getImportedKeys(IfxDatabaseMetaData.java:5524)

我在我的一台服务器上针对 stores_demo 数据库使用 4.10.JC8 进行了快速测试,并且没有出现故障:

d:\JJTMP>java -jar \jjtmp\schemaSpy_5.0.0.jar -t informix -db stores7 -s informix -u informix -p password -o \jjtmp -host 420ito:9088 -server ids1210 -dp \infx\jdbc410jc8x\lib\ifxjdbc.jar
Using database properties:
  [\jjtmp\schemaSpy_5.0.0.jar]/net/sourceforge/schemaspy/dbTypes/informix.properties
Gathering schema details....................................................................(4sec)
Writing/graphing summary..............(7sec)
Writing/diagramming details.................................................................(6sec)
Wrote relationship details of 65 tables/views to directory '\jjtmp' in 19 seconds.
View the results by opening \jjtmp\index.html

d:\JJTMP>

如果您得到 SQLI trace,您应该能够看到特定 SQL 失败的原因。 将 SQLIDEBUG 属性 添加到 schemaSpy 命令行中的连接字符串以生成一个。 像这样:

d:\JJTMP>java -jar \jjtmp\schemaSpy_5.0.0.jar -t informix -db stores7 -s informix -u informix -p password -o \jjtmp -host 420ito:9088 -server ids1210 -dp \infx\jdbc410jc8x1\lib\ifxjdbc.jar -connprops SQLIDEBUG\=trace
Using database properties:
  [\jjtmp\schemaSpy_5.0.0.jar]/net/sourceforge/schemaspy/dbTypes/informix.properties
Gathering schema details....................................................................(4sec)
Writing/graphing summary..............(7sec)
Writing/diagramming details.................................................................(6sec)
Wrote relationship details of 65 tables/views to directory '\jjtmp' in 18 seconds.
View the results by opening \jjtmp\index.html

d:\JJTMP>dir trace*
 Volume in drive D is Data750
 Volume Serial Number is F0B7-2E46

 Directory of d:\JJTMP

17/08/2017  11:10         2,008,706 trace1502964639886.0
               1 File(s)      2,008,706 bytes
               0 Dir(s)  284,868,997,120 bytes free

然后就可以使用sqliprint/sqliprtCSDK工具解码trace文件了(应该在engine bin目录下)

d:\JJTMP>sqliprt -notimestamp trace1502964639886.0 > trace.txt

d:\JJTMP>

但正如大家所说,在技术支持下打开一个勾号可能是个好主意。它可能特定于您的 database/schema(想知道它是否对其他数据库失败)但即使如此,无论应用程序做什么,getImportedKeys() 都不应该因该错误而失败。

我刚刚在这里回答了这个类似的问题 。该答案的副本如下。

我不得不寻求一些帮助来追踪这个问题,因为这是一个时间问题 + 驱动程序中的错误。

这里的问题是某些版本的 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 驱动程序,该驱动程序已正确解决此问题