Nano Hash - криптовалюты, майнинг, программирование

getSchema в драйвере JDBC PostgreSQL выдает исключение java.lang.AbstractMethodError или java.sql.SQLFeatureNotSupportedException

Я использую Postgresql 8.4, и мое приложение пытается подключиться к базе данных. Я зарегистрировал водителя:

DriverManager.registerDriver(new org.postgresql.Driver());

а затем попытайтесь установить соединение:

db = DriverManager.getConnection(database_url);

(кстати, моя строка jdbc выглядит примерно так: jdbc: postgresql: // localhost: 5432 / myschema? user = myuser & password = mypassword)

Я пробовал различные версии драйвера jdbc и получил два типа ошибок:

с jdbc3:

Exception in thread "main" java.lang.AbstractMethodError: org.postgresql.jdbc3.Jdbc3Connection.getSchema()Ljava/lang/String;

с jdbc4:

java.sql.SQLFeatureNotSupportedException: Il metodo ½org.postgresql.jdbc4.Jdbc4Connection.getSchema()╗ non Þ stato ancora implementato.

это означает: метод org.postgresql.jdbc4.Jdbc4Connection.getSchema () еще не реализован.

Я что-то упускаю, но не знаю что ...

------ РЕШЕНО ---------

Проблема заключалась не в строке подключения или версии драйвера, проблема была в коде непосредственно над методом getConnection():

db = DriverManager.getConnection(database_url);
LOGGER.info("Connected to : " + db.getCatalog() + " - " + db.getSchema());

Кажется, у драйвера postgresql нет метода getSchema, как мне часто пыталась сказать консоль java ...

09.10.2014

  • Какую версию драйвера вы используете? Имя файла jar содержит номер версии 09.10.2014
  • Я использовал: 8.4-702.jdbc3, 8.4-702.jdbc4, 9.2-1002.jdbc3, 9.2-1002.jdbc4, 9.2-1003.jdbc3, 9.2-1003.jdbc4, 9.3-1102.jdbc3, 9.3-1102. .jdbc4 и, возможно, пара других версий 09.10.2014
  • Покажите, пожалуйста, полный код вашего теста. Кроме того, какая у вас версия JVM? 09.10.2014
  • Краткая версия после обсуждения комментариев - та же ошибка с Class.forName. Использование JDK 1.7. Поэтому я думаю, что у вашего пути к классам есть несколько несовместимых версий PgJDBC (возможно, вложенных в другие банки?) Или что-то еще ужасно сломано. Мне нужно увидеть отдельный тестовый пример, чтобы помочь вам в дальнейшем. 09.10.2014
  • Сейчас я использую 9.3-1102-jdbc41, но думаю, что теперь, когда я удалил проблемный метод (db.getSchema ()), он может работать и с другими версиями. java версии 7. 09.10.2014
  • Источники находятся здесь, getSchema действительно не реализована ... 09.10.2014
  • Да, но в интерфейсе Connection он есть, поэтому автозаполнение eclipse показало метод, и я использовал его, не особо задумываясь. 09.10.2014
  • Вы не должны никогда вызывать DriverManager.registerDriver себя для получения обычных драйверов JDBC; это ловушка для java.sql.Driver реализаций, чтобы они регистрировались в DriverManager. 09.10.2014
  • В своих комментариях к теперь удаленному ответу вы упоминаете, что используете maven-shade, проблема может заключаться в том, что вы не включили (или перезаписали вместо объединения) файл META-INF/services/java.sql.Driver, который необходим для автоматической загрузки JDBC 4. 09.10.2014
  • @fvu getSchema реализована в следующем выпуске: github.com/pgjdbc/pgjdbc/blame/master/org/postgresql/jdbc4/ 09.10.2014
  • Я проверил, что java.sql.Driver содержится в моей банке в указанном вами каталоге. В любом случае, по вашему предложению я изменил DriverManager.registerDriver на Class.forName 13.10.2014

Ответы:


1

Добавлена ​​версия Connection.getSchema() в Java 7 / JDBC 4.1. Это означает, что он не обязательно доступен в драйвере JDBC 3 или 4 (хотя, если реализация существует, она будет вызвана).

Если вы используете драйвер JDBC 3 (Java 4/5) или драйвер JDBC 4 (Java 6) в Java 7 или выше, вполне возможно, что вы получите java.lang.AbstractMethodError при вызове getSchema, если он не существует в реализации. Java предоставляет форму прямой совместимости для классов, реализующих интерфейс.

Если к интерфейсу добавляются новые методы, классы, которые не имеют этих методов и были, например, скомпилированы для более старой версии интерфейса, все равно могут быть загружены и использованы при условии, что новые методы не вызываются. Отсутствующие методы будут заменены кодом, который просто выдает AbstractMethodError. С другой стороны: если бы метод getSchema был реализован и подпись была совместима, этот метод теперь был бы доступен через интерфейс, даже если метод не существовал в интерфейсе во время компиляции.

В марте 2011 г. драйвер был обновлен, чтобы его можно было скомпилировать на Java 7 (JDBC 4.1. ), это произошло путем замены новых методов JDBC 4.1 реализацией, которая генерирует java.sql.SQLFeatureNotSupportedException, включая 09.10.2014

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..