我使用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库。
知道问题是什么?
答案 0 :(得分:3)
与Jonathan达成100%同意。这应该报告给IBM技术支持。 IBM每年发布大约3个或Fixpacks,我认为没有理由让Informix 12.10用户受到惩罚。打开服务请求会很棒。我喜欢schemaSpy!
埃里克
答案 1 :(得分:2)
为了将来参考我可以通过用旧版本替换上面的驱动程序4.X来解决问题。似乎驱动程序有问题,或者SchemaSpy与较新的4.X驱动程序不兼容。工作的驱动程序是最新的3.X驱动程序(确切地说3.70.JC8)。
答案 2 :(得分:0)
查看堆栈时,服务器无法执行select并在尝试检索主键列表时向客户端返回错误:
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)
我在我的一台服务器上使用4.10.JC8对stores_demo数据库进行了快速测试,并且完成时没有粗俗:
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()也不会因该错误而失败,无论应用程序做什么。
答案 3 :(得分:0)
我刚刚在https://stackoverflow.com/a/55458418/8334122回答了类似的问题。该答案的副本在下面。
由于这是一个定时问题+驱动程序中的错误,我必须获得一些帮助来跟踪此问题。
此处的问题是某些版本的Informix JDBC驱动程序。快速解决方案是升级到最新的4.50.1驱动程序。出门了。
<!-- 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驱动程序,此驱动程序可以正确解决此问题