WARN - Не удалось получить getImportedKeys Курсор был ранее освобожден и недоступен - PullRequest
2 голосов
/ 11 марта 2019

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

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

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

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Трассировка стека жидкой базы, которую вы имели в Как использовать --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. Точная проблема может заключаться в том, что для того, чтобы команда поддержки наверняка разобралась с ней, нужно воспроизвести ее.

0 голосов
/ 01 апреля 2019

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

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

...