2

我正在使用SchemaSpy (5.0.0) 生成我们的 Informix 数据库的报告。在运行它时,在“收集架构详细信息”的最后一步中出现以下错误:

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

4 回答 4

3

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

埃里克

于 2017-03-03T19:39:35.197 回答
2

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

于 2017-02-28T13:04:42.183 回答
0

查看堆栈,服务器在尝试检索主键列表时无法执行选择并向客户端返回错误:

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 跟踪,您应该能够看到该特定 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/sqliprt CSDK 工具解码跟踪文件(它应该在引擎 bin 目录中)

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

d:\JJTMP>

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

于 2017-08-17T10:31:15.647 回答
0

我刚刚在这里https://stackoverflow.com/a/55458418/8334122回答了这个类似的问题。该答案的副本如下。

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

这里的问题在于某些版本的 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 驱动程序

于 2019-04-03T18:24:10.917 回答