WARN - Не удалось получить getImportedKeys Курсор был ранее освобожден и недоступен

Я использую SchemaSpy v6.1.0-SNAPSHOT в довольно здоровенной схеме Informix 12.10, и я получаю сообщение об ошибке "WARN - Failed to getImportedKeys Курсор ранее освобожден и недоступен".

Я ничего не знаю о Java, но я заметил очень похожую ошибку с Liquibase (также написанной на Java), и я удивился:

  1. может ли кто-нибудь посоветовать мне, что вызывает эту ошибку и как я могу ее избежать / обойти, учитывая, что я не особенно хочу изучать Java:-)
  2. является ли это специфичным для Informix или это также наблюдается в других базах данных?

2 ответа

Решение

Трассировка стека жидкостной базы, которую вы имели в разделе Как использовать --logLevel в Liquibase, на самом деле дает нам подсказку, но мне понадобилось время, чтобы разобраться, что, вероятно, происходит. Там мы можем увидеть ликвидазу с использованием кэшированного набора результатов. Кэширование ResultSets (курсоры) опасно, так как драйвер Informix JDBC не удерживает курсоры над коммитами. Таким образом, есть большая вероятность, что программа открыла набор результатов (курсор) и выполнила какую-то другую операцию, которая заставила Informix/JDBC закрыть курсор, затем она попыталась использовать уже закрытый курсор, что вызывает вашу ошибку.

Существует API, чтобы заставить JDBC держать курсоры открытыми:connection.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT)

Но я предполагаю, что у вас нет возможности повлиять на это внутри этих продуктов, чтобы попробовать это. К сожалению, Informix не позволяет этому параметру войти в URL. Функция, которая должна быть добавлена ​​:)

Я протестировал схему на одной из моих баз данных (22 таблицы, 126 столбцов) без проблем с последним драйвером 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 неправильно закрывала ресурсы, что иногда приводило к тому, что этот чистый поток иногда закрывал ресурсы в середине работы. Поэтому некоторые люди видят это часто, а некоторые никогда. Вы можете обойти это с 4.10.JC12, где мы добавили флаг соединения, чтобы отключить поток очистки (IFMXCONNECTION_CLEANER_THREADS=0). Или лучшим вариантом является обновление до новейшего драйвера 4.50.1, в котором эта проблема исправлена ​​правильно.

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