Ганебний виняток java.sql.SQLE: Не знайдено відповідного драйвера


89

Я намагаюся додати JSP з підтримкою бази даних до існуючої програми Tomcat 5.5 (GeoServer 2.0.0, якщо це допомагає).

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

Ось вершина JSP:

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<sql:query var="rs" dataSource="jdbc/mmas">
  select current_validstart as ValidTime from runoff_forecast_valid_time
</sql:query>

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

<Context path="/gs2" allowLinking="true">
  <Resource name="jdbc/mmas" type="javax.sql.Datasource"
      auth="Container" driverClassName="org.postgresql.Driver"
      maxActive="100" maxIdle="30" maxWait="10000"
      username="mmas" password="very_secure_yess_precious!"
      url="jdbc:postgresql//localhost:5432/mmas" />
</Context>

Ці рядки є останніми в тезі в webapps / gs2 / WEB-INF / web.xml:

<resource-ref>
  <description>
     The database resource for the MMAS PostGIS database
  </description>
  <res-ref-name>
     jdbc/mmas
  </res-ref-name>
  <res-type>
     javax.sql.DataSource
  </res-type>
  <res-auth>
     Container
  </res-auth>
</resource-ref>

Нарешті, виняток:

   exception
    org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
    [...wads of ensuing goo elided]

Дивіться моя відповідь: stackoverflow.com/a/38656446/632951
Pacerier

Відповіді:


106

Ганебний виняток java.sql.SQLE: Не знайдено відповідного драйвера

Цей виняток може мати в основному дві причини:

1. Драйвер JDBC не завантажений

Вам потрібно переконатися, що драйвер JDBC розміщений у власній /libпапці сервера .

Або, коли ви насправді не використовуєте кероване сервером джерело даних пулу підключень, але вручну возиться з ним DriverManager#getConnection()у WAR, тоді вам потрібно помістити драйвер JDBC у WAR /WEB-INF/libта виконати ..

Class.forName("com.example.jdbc.Driver");

.. у своєму коді до першого DriverManager#getConnection()дзвінка, завдяки чому ви переконуєтесь, що не проковтуєте / ігноруєте будь- ClassNotFoundExceptionщо, що може бути кинуте ним, і продовжуєте потік коду так, ніби нічого виключного не сталося. Див. Також Де потрібно розмістити драйвер JDBC для пулу підключень Tomcat?

2. Або URL-адреса JDBC має неправильний синтаксис

Потрібно переконатись, що URL-адреса JDBC відповідає документації драйвера JDBC, і пам’ятайте, що зазвичай це чутливий регістр. Коли URL-адреса JDBC не повертається trueдля Driver#acceptsURL()жодного із завантажених драйверів, ви також отримаєте саме цей виняток.

У випадку з PostgreSQL це зафіксовано тут .

У JDBC база даних представлена ​​URL-адресою (Uniform Resource Locator). З 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


Дивіться також:


Дякую, хлопці! На жаль, перша спроба не була в OP, просто jdbc: postgresql: mmas (а я пробував інші!). На жаль, з URL-адресою araqnid такий же результат. Вчора ввечері я поміняв речі tablib на (ick) вбудовану Java, і це чудово працює: спробуйте {Class.forName ("org.postgresql.Driver"). con = DriverManager.getConnection ("jdbc: postgresql: mmas", "mmas", "passwd"); stmt = con.createStatement (); rs = stmt.executeQuery ("вибрати yada yada"); if (rs! = null && rs.next ()) {// пожинати славу, багатство, славу, крихітки Приклад Джакарти був w / taglibs, тому я почав з цього шляху.
Рік Вейн,

Ага. Коментарі не стільки з форматуванням коду. Гм. Чи показує мій новачок? (ZIIP!) У будь-якому випадку, приклад Джакарти стосувався використання синтаксису <sql: query> замість того, щоб просто вбудовувати код Java, і я згоден, що це набагато чистіший спосіб це зробити. Не потрібно чітко закликати forName () та getConnection (), правда? Але старий потворний метод hack-the-driver-code-in-the-the-презентаційний шар працював чудово, спочатку спробуйте. Тож я збентежений, але зараз це більше проблема технічного обслуговування / естетики, аніж "Це зламано, виправте це або розіб'єте свої навички гартування".
Rick Wayne

IMHO, використовуючи sql taglib, лише трохи кращий, ніж робити JDBC у скриплетах ... набагато більше віддає перевагу шаблону контролера / перегляду, де матеріали db виконуються заздалегідь, а JSP просто відображає речі. Хоча кожен по своєму, а використання sql: query робить речі простими :) (ish)
araqnid

Я ніколи не говорив, що погоджуюсь із використанням JSTL SQL taglib, але це не тема, про яку йдеться в цій темі.
BalusC

2
Дякуємо, Ваші формати рядків підключення JDBC були надзвичайно корисними!
Джей Тейлор,

15
url="jdbc:postgresql//localhost:5432/mmas"

Ця URL-адреса виглядає неправильно. Вам потрібно наступне?

url="jdbc:postgresql://localhost:5432/mmas"

15

Я забув додати драйвер PostgreSQL JDBC у свій проект ( Mvnrepository ).

Градле :

// http://mvnrepository.com/artifact/postgresql/postgresql
compile group: 'postgresql', name: 'postgresql', version: '9.0-801.jdbc4'

Мейвен :

<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.0-801.jdbc4</version>
</dependency>

Ви також можете завантажити з JAR і імпортувати в ваш проект вручну.


12

Я зіткнувся з подібною проблемою. Мій проект у контексті - це Динамічний веб-проект (Java 8 + Tomcat 8), а помилка - для винятку драйвера PostgreSQL: Відповідного драйвера не знайдено

Це було вирішено додаванням Class.forName("org.postgresql.Driver")перед викликом getConnection()методу

Ось мій зразок коду:

try {
            Connection conn = null;
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/?preferQueryMode="
                    + sql_auth,sql_user , sql_password);
        } catch (Exception e) {
            System.out.println("Failed to create JDBC db connection " + e.toString() + e.getMessage());
        }

3

Я знайшов наступну підказку корисною, щоб усунути цю проблему в Tomcat -

переконайтеся, що спочатку завантажуєте драйвер, виконуючи Class.forName ("org.postgresql.Driver"); у вашому коді.

Це з допису - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

Код jdbc відмінно працював як окрема програма, але в TOMCAT він видав помилку-'Не знайдено відповідного драйвера'


Будь ласка, жодне посилання не відповідає - коротко опишіть, що за цим стоїть!
Монамона,

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

1

Можливо, варто зазначити, що це також може статися, коли Windows блокує завантаження, які, на її думку, небезпечні. Цю проблему можна вирішити, клацнувши правою кнопкою миші файл jar (наприклад, ojdbc7.jar) та встановивши прапорець біля пункту «Розблокувати» внизу.

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


1

Окрім додавання з'єднувача MySQL JDBC, переконайтесь, що context.xml (якщо він не розпакований у папці Tomcat webapps) з визначеннями підключення до БД включені до каталогу Tomcats conf.


1

Дуже безглузда помилка, яка могла б виникнути, це додавання місця на початку з'єднання URL-адреси JDBC.

Я маю на увазі:

припустимо, у вас є помилка, враховуючи URL-адресу jdbc, як

String jdbcUrl=" jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(Зверніть увагу, що в погляді URL-адреси є пробіл, це призведе до помилки)

правильним шляхом має бути:

String jdbcUrl="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(Зверніть увагу на відсутність місця в погляді, ви можете дати пробіл у кінці URL-адреси, але це безпечно)


0

Я використовував jruby, у моєму випадку я створював під конфігурацією / ініціалізаторами

postgres_driver.rb

$CLASSPATH << '~/.rbenv/versions/jruby-1.7.17/lib/ruby/gems/shared/gems/jdbc-postgres-9.4.1200/lib/postgresql-9.4-1200.jdbc4.jar'

або де б не був ваш водій, і все!


0

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

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

Також пізніше знайдено приклад весняного гуру зі специфічним драйвером Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Приклад, який видає помилку з використанням org.springframework.jdbc.datasource.DriverManagerDataSourceна основі загальних прикладів.

@Config
@EnableTransactionManagement
public class appDataConfig {
 \* Other Bean Defs *\
    @Bean
    public DataSource dataSource() {
        // configure and return the necessary JDBC DataSource
        DriverManagerDataSource dataSource = new DriverManagerDataSource("jdbc:oracle:thin:@//HOST:PORT/SID", "user", "password");
        dataSource.setSchema("MY_SCHEMA");
        return dataSource;
    }
}

І виправлений приклад з використанням oracle.jdbc.pool.OracleDataSource:

@Config
@EnableTransactionManagement
public class appDataConfig {
/* Other Bean Defs */
@Bean
    public DataSource dataSource() {
        // configure and return the necessary JDBC DataSource
        OracleDataSource datasource = null;
        try {
            datasource = new OracleDataSource();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        datasource.setURL("jdbc:oracle:thin:@//HOST:PORT/SID");
        datasource.setUser("user");
        datasource.setPassword("password");

        return datasource;
    }
}

0

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

Помилка зникла, коли я додав драйвер jar mysql-connector-java-8.0.16.jar до папки jres lib / ext

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

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver

0

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

CLASSPATH='.:drivers/mssql-jdbc-6.2.1.jre8.jar' java ConnectURL

Де drivers/mssql-jdbc-6.2.1.jre8.jarшлях до файлу драйвера (наприклад, JDBC для для SQL Server ).

Це ConnectURLзразок програми з цього драйвера ( samples/connections/ConnectURL.java), складений через javac ConnectURL.java.


0

У моєму випадку я працював над проектом Java з Maven і зіткнувся з цією помилкою. У вашому файлі pom.xml переконайтеся, що у вас є ці залежності

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.11</version>
    </dependency>
  </dependencies>

і там, де ви створюєте зв’язок, є щось подібне

public Connection createConnection() {
        try {
            String url = "jdbc:mysql://localhost:3306/yourDatabaseName";
            String username = "root"; //your my sql username here
            String password = "1234"; //your mysql password here

            Class.forName("com.mysql.cj.jdbc.Driver");
            return DriverManager.getConnection(url, username, password);
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

Вам не потрібно телефонувати Class.forName. DriverManagerповинен мати можливість його знайти.
Стівен С

Можливо ти правий. Java не є моєю основною мовою кодування.
Justice Bringer

0

Ви отримаєте цю саму помилку, якщо десь не вказано визначення ресурсу для вашої програми - швидше за все, або в центральному context.xml, або окремому контекстному файлі в conf / Catalina / localhost. А якщо ви використовуєте окремі контекстні файли, пам’ятайте, що Tomcat їх вільно видаляє щоразу, коли ви видаляєте / скасовуєте відповідний файл .war.


0

Незалежно від того, скільки років стане ця тема, люди будуть продовжувати стикатися з цією проблемою.

Мій випадок: Я маю останню (на момент публікації) програму налаштування OpenJDK та maven. Я випробував усі методи, наведені вище, з / поза maven і навіть рішення для побратимів на StackOverflow. Я не використовую будь-яку IDE або щось інше, запускаючи з простого CLI, щоб продемонструвати лише основну логіку.

Ось, що нарешті вдалося.

  • Завантажте драйвер з офіційного сайту. (для мене це був MySQL https://www.mysql.com/products/connector/ ). Використовуйте тут свій смак.
  • Розпакуйте даний файл jar в тому ж каталозі, що і ваш проект Java. Ви отримаєте таку структуру каталогів. Якщо ви уважно подивитесь, це точно стосується того, що ми намагаємось зробити, використовуючи Class.forName(....). Нам потрібен файлcom/mysql/jdbc/Driver.class

https://i.imgur.com/VgpwatQ.png

  • Скомпілюйте програму Java, що містить код.
javac App.java
  • Тепер завантажте директор як модуль, запустивши
java --module-path com/mysql/jdbc -cp ./ App

Це завантажить (витягнутий) пакет вручну, і ваша програма Java знайде необхідний клас драйверів.


  • Зверніть увагу, що це було зроблено для mysqlдрайвера, інші драйвери можуть зажадати незначних змін.
  • Якщо ваш постачальник надає .debзображення, ви можете отримати банку/usr/share/java/your-vendor-file-here.jar

-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.