WARN - Не удалось получить getImportedKeys Курсор был ранее освобожден и недоступен
Я использую SchemaSpy v6.1.0-SNAPSHOT в довольно здоровенной схеме Informix 12.10, и я получаю сообщение об ошибке "WARN - Failed to getImportedKeys Курсор ранее освобожден и недоступен".
Я ничего не знаю о Java, но я заметил очень похожую ошибку с Liquibase (также написанной на Java), и я удивился:
- может ли кто-нибудь посоветовать мне, что вызывает эту ошибку и как я могу ее избежать / обойти, учитывая, что я не особенно хочу изучать Java:-)
- является ли это специфичным для 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, в котором эта проблема исправлена правильно.