SchemaSpy - сообщение об ошибке при создании отчета

Я использую 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)

Я использую драйвер Informix JDBC в версии 4.1.0 (также пробовал 4.10.8.1). Странно, что этот драйвер также нуждается в библиотеке BSON.

Есть идеи, в чем проблема?

3 ответа

Согласитесь на 100% с Джонатаном. Об этом следует сообщить в службу технической поддержки IBM. IBM выпускает около 3 или Fixpacks в год, и я не вижу причин для наказания пользователя Informix 12.10. Было бы здорово открыть запрос на обслуживание. Я люблю scheSpy!

Эрик

Для дальнейшего использования я могу решить эту проблему, заменив вышеуказанный драйвер 4.X на более старую версию. Кажется, что драйвер глючит или SchemaSpy не совместим с более новыми драйверами 4.X. Драйвер, который работал, был последним 3.X драйвером ( 3.70.JC8, если быть точным).

Глядя на стек, сервер не может сделать выбор и возвращает ошибку клиенту, когда он пытается получить список первичных ключей:

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 на одном из моих серверов по базе данных store_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

Затем вы можете декодировать файл трассировки, используя инструмент CSDK sqliprint /sqliprt (он должен находиться в каталоге bin)

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

d:\JJTMP>

Но, как все говорили, неплохо было бы открыть галочку с техподдержкой. Это может быть характерно для вашей базы данных / схемы (интересно, не сработает ли это с другими базами данных), но даже в этом случае getImportedKeys() не должен завершаться с этой ошибкой, независимо от того, что делает приложение.

Я только что ответил на этот похожий вопрос здесь /questions/48583469/warn-ne-udalos-poluchit-getimportedkeys-kursor-byil-ranee-osvobozhden-i-nedostup/48583492#48583492. Копия этого ответа ниже.

Я должен был получить помощь, чтобы отследить это, так как это проблема синхронизации + ошибка в драйвере.

Проблема здесь заключается в некоторых версиях драйвера 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, в котором эта проблема исправлена ​​правильно.

Другие вопросы по тегам