В каком случае при вызове drivermanager getconnection появляется ошибка no suitable driver

Обновлено: 05.07.2024

Я пытаюсь добавить JSP с поддержкой базы данных к существующему приложению Tomcat 5.5 (GeoServer 2.0.0, если это помогает).

Приложение само по себе говорит с Postgres как раз прекрасно, поэтому я знаю, что база данных готова, пользователь может получить к ней доступ, все это хорошее. То, что я пытаюсь сделать, - это запрос базы данных в JSP, который я добавил. Я использовал пример конфигурации в примере источника данных Tomcat в значительной степени из коробки. Необходимые taglib находятся в нужном месте - никаких ошибок не возникает, если у меня есть только теги taglib, поэтому они находят эти JAR. Драйвер postgres jdbc, postgresql-8.4.701.jdbc3.jar находится в $CATALINA_HOME/common/lib.

Здесь верхняя часть JSP:

Соответствующий раздел из $CATALINA_HOME/conf/server.xml внутри <Host> , который в свою очередь находится внутри <Engine> :

Эти строки являются последними в теге в webapps/gs2/WEB-INF/web.xml:

ОТВЕТЫ

Ответ 1

Позорное java.sql.SQLException: не найдено подходящего драйвера

Это исключение может иметь в основном два причины:

Вам нужно убедиться, что драйвер JDBC помещен в собственную папку /lib .


В случае PostgreSQL он документируется здесь.

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

В случае MySQL он документирован здесь.

Общий формат URL-адреса JDBC для подключения к серверу MySQL следующий: элементы в квадратных скобках ( [ ] ) являются необязательными:

jdbc:mysql://[host1][:port1][,[host2][:port2]]. [/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]. ]

В случае Oracle он документируется здесь.

Существует 2 синтаксиса URL, старый синтаксис, который будет работать только с SID и новый с именем службы Oracle.

Старый синтаксис jdbc:oracle:thin:@[HOST][:PORT]:SID

Новый синтаксис jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

См. также:

Ответ 2

Этот URL-адрес выглядит неправильно, вам нужно следующее:

Ответ 3

Я сталкивался с подобной проблемой. Мой проект в контексте - динамический веб-проект (Java 8 + Tomcat 8), и ошибка для исключения драйвера PostgreSQL: подходящий драйвер не найден

Это было решено добавлением Class.forName("org.postgresql.Driver") перед вызовом метода getConnection()

Вот мой пример кода:

Ответ 4

Я забыл добавить драйвер PostgreSQL JDBC в проект Mvnrepository.

Gradle:

Maven:

Вы также можете загрузить JAR и импортировать в свой проект вручную.

Ответ 5

Я нашел полезный совет, чтобы устранить эту проблему в Tomcat -

обязательно загрузите драйвер, сначала выполнив Class.forName("org.postgresql.Driver"); в вашем коде.

Код jdbc работал как отдельная программа, но в TOMCAT выдавал ошибку "Не найден подходящий драйвер"

Ответ 6

Возможно, стоит отметить, что это также может произойти, когда Windows блокирует загрузки, которые он считает небезопасными. Это можно устранить, щелкнув правой кнопкой мыши файл jar (например, ojdbc7.jar) и проверив флажок "Разблокировать" внизу.

Windows JAR File Properties Dialog

Диалоговое окно свойств файла JAR для Windows:

Ответ 7

Я использовал jruby, в моем случае я создал в config/initializers

или где бы вы ни находились, и что это!

Ответ 8

Помимо добавления соединителя JDBC MySQL, файл context.xml(если он не распакован в папке webapps Tomcat) с вашими определениями соединений с БД включены в каталог Tomcats conf.

Ответ 9

У меня возникла эта точная проблема при разработке приложения загрузки Spring в STS, но в конечном итоге развертывание упакованной войны в WebSphere (v.9). Основываясь на предыдущих ответах, моя ситуация была уникальной. ojdbc8.jar был в моей папке WEB-INF/lib с установленным набором родительского последнего класса, но всегда говорит, что не удалось найти подходящий драйвер.

Моя последняя проблема заключалась в том, что я использовал неправильный класс DataSource, потому что я просто следил за онлайн-учебниками/примерами. Нашел подсказку, в которой Дэвид Дай прокомментировал свой вопрос: Spring JDBC Не удалось загрузить класс драйвера JDBC [oracle.jdbc.driver.OracleDriver]

Пример, который генерирует ошибку с использованием org.springframework.jdbc.datasource.DriverManagerDataSource на основе общих примеров.

И исправленный exapmle с помощью oracle.jdbc.pool.OracleDataSource :

Ответ 10

Я столкнулся с этой проблемой, неправильно поместив XML файл в src/main/resources , удалил его и затем все вернулось в нормальное состояние.

Ответ 11

Очень глупая ошибка, которая может быть возможна в результате, - добавление пробела в начале URL-соединения JDBC.

Предположим, у вас есть bymistake, учитывая как JDBC URL

(Обратите внимание, что в начале URL-адреса есть пробел, это приведет к ошибке)

правильный путь должен быть:

(Обратите внимание на отсутствие пробела при просмотре, вы можете оставить пробел в конце URL, но это безопасно)

Ответ 12

У меня была та же проблема с источником данных mysql, использующим пружинные данные, которые работали бы снаружи, но выдавали эту ошибку при развертывании на tomcat.

Ошибка исчезла, когда я добавил драйвер jar mysql-connector-java-8.0.16.jar в папку jres lib/ext

Однако я не хотел делать это на производстве, опасаясь вмешательства в другие приложения. Простота определения класса драйвера решила эту проблему для меня

Ответ 13

Запустите java с переменной среды CLASSPATH , указывающей на файл JAR драйвера, например,

Где drivers/mssql-jdbc-6.2.1.jre8.jar - это путь к файлу драйвера (например, JDBC for для SQL Server).

Я пытаюсь добавить JSP с поддержкой базы данных в существующее приложение Tomcat 5.5 (GeoServer 2.0.0, если это помогает).

Само приложение прекрасно взаимодействует с Postgres, поэтому я знаю, что база данных работает, пользователь может получить к ней доступ и все такое хорошее. Я пытаюсь выполнить запрос к базе данных в добавленном мной JSP. Я использовал пример конфигурации в примере с источником данных Tomcat практически сразу после установки. Необходимые библиотеки тегов находятся в нужном месте - ошибок не возникает, если у меня есть только ссылки на библиотеки тегов, поэтому он находит эти JAR. Драйвер postgres jdbc, postgresql-8.4.701.jdbc3.jar находится в $ CATALINA_HOME / common / lib.

Соответствующий раздел из $ CATALINA_HOME / conf / server.xml, внутри <Host> которого, в свою очередь, находится внутри <Engine> :

Эти строки являются последними в теге в webapps / gs2 / WEB-INF / web.xml:

Печально известный java.sql.SQLException: подходящий драйвер не найден

Это исключение может иметь две основные причины:

Вам необходимо убедиться, что драйвер JDBC находится в собственной /lib папке сервера .


В случае PostgreSQL это описано здесь .

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

В случае MySQL это описано здесь .

Общий формат URL-адреса JDBC для подключения к серверу MySQL следующий, при этом элементы в квадратных скобках ( [ ] ) являются необязательными:

jdbc:mysql://[host1][:port1][,[host2][:port2]]. [/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]. ]

В случае Oracle это описано здесь .

Есть 2 синтаксиса URL: старый синтаксис, который будет работать только с SID, и новый синтаксис с именем службы Oracle.

Старый синтаксис jdbc:oracle:thin:@[HOST][:PORT]:SID

Новый синтаксис jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Имеется spring-mvc проект. На локальной системе через mvn tomcat7:run запускается без проблем. При попытке деплоя на удаленный сервер (centos7/tomcat7 из репозитория) получаю следующее:

Конфиги одинаковые. В pom.xml прописан драйвер, пробовала разные версии, на десктопе работает, на сервере нет:

jar вместе с другими зависимостями попадает в /lib каталог проекта: В чем может быть проблема? Tomcat из репов centos привносит свою магию. Сначала билась над тем, что hibernate-validator шестой ветки с ним несовместим из-за старого tomcat-el, теперь вот это. Гуглёж ничего не дал.


Попробуй положить драйвер в $CATALINA_HOME/lib, а в pom.xml в dependency добавь <scope>provided</scope>


Если совет выше не проканает, попробуй встать удаленным отладчиком на строчку в `DriverManager.getConnection` и посмотреть, что там происходит


Настоятельно рекомендую выбросить все эти репы центоса, скачать томкат с сайта, распаковать куда душе угодно и попробовать запускать с ним. С JDK настоятельно рекомендую сделать то же самое (с сайта оракла), если не уже. Дистроделы частенько с жавой умудряются создать проблемы на ровном месте.


Попробуй положить драйвер в $CATALINA_HOME/lib, а в pom.xml в dependency добавь <scope>provided</scope>

Этот вариант не помог.

sanwashere ★★ ( 10.08.18 08:41:43 )
Последнее исправление: sanwashere 10.08.18 08:43:24 (всего исправлений: 1)


Настоятельно рекомендую выбросить все эти репы центоса, скачать томкат с сайта, распаковать куда душе угодно и попробовать запускать с ним. С JDK настоятельно рекомендую сделать то же самое (с сайта оракла), если не уже. Дистроделы частенько с жавой умудряются создать проблемы на ровном месте.

Развернула tomcat 9 скачанный с официального сайта. Картина та же самая. По части взаимодействия с СУБД через этот драйвер у жабки из репозитория проблем нет, ибо mvn tomcat7:run на удаленном сервере корректно запускает проект.


Да, java восьмая. Варианты драйвером для других версий вызывают ту же ошибку.


Это слишком сложно для меня. Удаленную разработку я еще не осилила =)

totik ★ ( 10.08.18 09:04:44 )
Последнее исправление: totik 10.08.18 09:05:05 (всего исправлений: 1)


Этот jar вместе с остальными зависимостями проекта помещен автоматически мавеном в WEB-INF/lib. Так же я вручную копировала его в $CATALINA_HOME/lib.


там надо всего два параметра при запуске прописать и подцепиться отладчиком (та же IDE). погугли

Уберите из $CATALINA_HOME/lib во избежание путаницы между двумя библиотеками драйвера( оно ещё может быть неправильным, но если убрать оттуда, то это можно и не проверять). Если место правильное, то возможно, ошибка в Java коде загрузки JDBC драйвера, а именно в class.forMame() может быть задано неправильное имя класса. Я вообще не применяю class.forName(), это старомодный способ. Вместо этого использую DriverManager.getConnection(), при котором задавать имя класса драйвера не нужно.


У меня нет в проекте сервисного кода по загрузке драйверов. Я использую spring/jpa/hibernate.


Подключилась удаленно. Захожу в JdbcEnvironmentInitiator.initiateService, далее попадаю в DriverManagerDataSource.getConnectionFromDriverManager, из этого метода вызывается DriverManager.getConnection.

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


А, так ты не задаёшь класс драйвера. Хз, прошли ли, я всегда указываю. Попробуй указать driverClassName в DriverManagerDataSource-е. По крайней мере ошибка будет ближе к делу.


почему-то пакеты с джавасофтом в gnu-linux собирают одни шизики

джавасофт лучше всего качать с оффсайта и добавлять в $PATH


а ты прям в момент отладки попробуй сделать

в IntelliJ IDEA консоль для динамического ввода кода через Alt+F8 в Win (в маке так же) открывается, но я не помню, работает ли она для удаленной отладки :-)

или в код софтины пропиши, если ты сама его написала

если класс найдется - значит все-таки проблемы с настройкой Hibernate, и надо показать нам как ты его настраиваешь

если класс не найдется - надо продолжать шаманить с classpath твоего томката

вообще, имхо, вся эта история с сервелет-контейнерами и аппсерверами - жуткая срань, и пора бы уже им сдохнуть

вообще, имхо, вся эта история с сервелет-контейнерами и аппсерверами - жуткая срань, и пора бы уже им сдохнуть

А я думал в этом вся суть джавки


А, так ты не задаёшь класс драйвера. Хз, прошли ли, я всегда указываю. Попробуй указать driverClassName в DriverManagerDataSource-е. По крайней мере ошибка будет ближе к делу.

Бинго! Заработало! Ну елки-палки! Почему же запуская локально через mvn tomcat7:run указание драйвера не требовалось?

Спасибо всем, кто откликнулся.


Почему же запуская локально через mvn tomcat7:run указание драйвера не требовалось?

Я детали не знаю, но по идее DriverManager при запуске сканирует ClassPath, ковыряется во всех jar-файлах и ищет там всякие META-INF/services/java.sql.Driver. Если нашёл, то регистрирует драйвер. Значит на линуксе твоём по какой-то причине он этого поиска не производит или же драйвер не находит (ещё более странно). Тут надо ковыряться, в какой момент он этот поиск пытается делать, отладчиком цепляться и смотреть, почему не находит. Может там какой-нибудь флаг есть, чтобы пропустить этот поиск (перелопатить все jar-файлы это определённая работа, в частности из-за подобных технологий всякие томкаты так долго стартуют), который у тебя включён.

Что такое CLASSPATH для Tomcat-а - не так очевидно, поскольку Tomcat использует несколько загрузчиков классов (необходимо ознакомиться с ними в документации по Tomcat-у). В результате если класс есть и загружен, но не тем загрузчиком классов, то он может быть не найден программой. Поэтому иногда лучше обходиться без дубликатов jar-файлов в разных папках. Но это не недостаток Tomcat-а , сервлетов и Java, а факт, означающий, что для пользования ими нужны некоторые знания.


Эх, как же я рада! Настроила nginx с proxy на tomcat. Проект деплоится одной командой, красота Как же хороша и удобна жабка, когда все работает =)

У меня есть консольное приложение Maven, использующее JDBC, FirebirdSQL и Java 8, согласно спецификации, больше не нужно добавлять регистрацию класса, поэтому строка Class.forName("org.firebirdsql.jdbc.FBDriver"); закомментирована, но когда я запускаю проект, я получаю ошибка: No suitable driver found for jdbc:firebirdsql://localhost/database , но если я раскомментирую строку, она работает нормально.

Любопытно, что если я использую простую консоль Project без использования Maven, он работает со строкой, прокомментированной, как указано в спецификации, поэтому вопрос: есть ли способ начать работать с Maven, также комментируя строку регистрации класса?

2 ответа

Похоже, вы используете старую версию Jaybird (драйвер JDBC FirebirdSQL). Версия 2.2 и выше реализуют спецификацию JDBC 4.0, которая не требует синтаксиса Class.forName() .

Благодаря механизму Java SE Service Provider, включенному в Mustang, разработчикам Java больше не нужно явно загружать драйверы JDBC, используя такой код, как Class.forName (), для регистрации драйвера JDBC. Класс DriverManager позаботится об этом, автоматически найдя подходящий драйвер при вызове метода DriverManager.getConnection ().

Итак, обновите свой JDBC-драйвер Jaybird (ссылка ниже) и просто опустите метод Class.forName() . Это унаследовано и не требуется для драйверов JDBC (JDBC версии 4.0 и выше).

Согласно документации Jaybird, вы должны использовать в своем POM следующее:

  • artifactId зависит от вашей целевой версии Java: jaybird-jdk18, jaybird-jdk17 или jaybird-jdk16

Старые драйверы JDBC не используют новую структуру Java ServiceLoader. Это означает, что ClassLoader не регистрирует «JDBC Service Provider», потому что крючки в файле META-INF/services/java.sql.Driver отсутствуют, поскольку файл не выходит.

Строка кода, которую вы закомментировали, имеет «статический» блок, который запускается при создании первого экземпляра, и содержимое этого статического блока регистрирует драйвер JDBC в DriverManager. Это «старый» способ сделать это, и почему вам нужна эта строка, чтобы она работала.

По сути, вы пытаетесь использовать новую технику со старым кодом. Получите новый файл JAR (если есть), и есть шанс, что он будет работать с новой техникой.

Читайте также: