Java.sql.SQLException yang terkenal: Tidak ditemukan driver yang sesuai

90

Saya mencoba menambahkan JSP yang mendukung database ke aplikasi Tomcat 5.5 yang ada (GeoServer 2.0.0, jika itu membantu).

Aplikasi itu sendiri berbicara dengan Postgres dengan baik, jadi saya tahu bahwa database sudah habis, pengguna dapat mengaksesnya, semua hal bagus itu. Apa yang saya coba lakukan adalah kueri database di JSP yang telah saya tambahkan. Saya telah menggunakan contoh konfigurasi dalam contoh sumber data Tomcat di luar kotak. Taglib yang diperlukan ada di tempat yang benar - tidak ada kesalahan yang terjadi jika saya hanya memiliki taglib ref, jadi saya menemukan JAR tersebut. Driver jdbc postgres, postgresql-8.4.701.jdbc3.jar ada di $ CATALINA_HOME / common / lib.

Inilah bagian atas 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>

Bagian yang relevan dari $ CATALINA_HOME / conf / server.xml, di <Host>dalamnya ada di dalam <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>

Baris ini adalah yang terakhir pada tag di 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>

Terakhir, pengecualian:

   exception
    org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
    [...wads of ensuing goo elided]
Rick Wayne
sumber
Lihat jawaban saya: stackoverflow.com/a/38656446/632951
Pacerier

Jawaban:

109

Java.sql.SQLException yang terkenal: Tidak ditemukan driver yang sesuai

Pengecualian ini pada dasarnya dapat memiliki dua penyebab:

1. Driver JDBC tidak dimuat

Anda perlu memastikan bahwa driver JDBC ditempatkan di /libfolder server sendiri .

Atau, ketika Anda sebenarnya tidak menggunakan sumber data kumpulan koneksi yang dikelola server, tetapi secara manual mengotak-atik DriverManager#getConnection()WAR, maka Anda perlu menempatkan driver JDBC di WAR /WEB-INF/libdan melakukan ..

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

.. dalam kode Anda sebelumDriverManager#getConnection() panggilan pertama di mana Anda memastikan bahwa Anda tidak menelan / mengabaikan apa pun ClassNotFoundExceptionyang dapat dilemparkan olehnya dan melanjutkan aliran kode seolah-olah tidak ada hal luar biasa yang terjadi. Lihat juga Di mana saya harus menempatkan driver JDBC untuk kumpulan koneksi Tomcat?

2. Atau, URL JDBC memiliki sintaks yang salah

Anda perlu memastikan bahwa URL JDBC sesuai dengan dokumentasi driver JDBC dan perlu diingat bahwa biasanya peka huruf besar kecil. Ketika URL JDBC tidak kembali trueuntuk Driver#acceptsURL()driver mana pun yang dimuat, maka Anda juga akan mendapatkan pengecualian ini.

Dalam kasus PostgreSQL itu didokumentasikan di sini .

Dengan JDBC, database diwakili oleh URL (Uniform Resource Locator). Dengan PostgreSQL ™, ini mengambil salah satu bentuk berikut:

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

Dalam kasus MySQL, hal itu didokumentasikan di sini .

Format umum URL JDBC untuk menghubungkan ke server MySQL adalah sebagai berikut, dengan item dalam tanda kurung siku ( [ ]) bersifat opsional:

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

Dalam kasus Oracle, hal itu didokumentasikan di sini .

Ada 2 sintaks URL, sintaks lama yang hanya akan bekerja dengan SID dan yang baru dengan nama layanan Oracle.

Sintaks lama jdbc:oracle:thin:@[HOST][:PORT]:SID

Sintaks baru jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


Lihat juga:

BalusC
sumber
Terima kasih teman-teman! Maaf upaya pertama tidak dalam OP, hanya jdbc: postgresql: mmas (dan saya sudah mencoba yang lain!). Sayangnya, dengan URL araqnid, hasilnya sama. Tadi malam saya menukar hal-hal tablib untuk (ick) Java yang disematkan, dan itu berfungsi dengan baik: coba {Class.forName ("org.postgresql.Driver"). NewInstance (); con = DriverManager.getConnection ("jdbc: postgresql: mmas", "mmas", "passwd"); stmt = con.createStatement (); rs = stmt.executeQuery ("pilih yada yada"); if (rs! = null && rs.next ()) {// reap fame, fortune, glory, babes Jakarta contoh w / taglibs, jadi saya mulai dari situ.
Rick Wayne
Ah. Komentar tidak terlalu banyak dengan pemformatan kode. Ahem. Apakah pemula saya tampil? (ZIIP!) Bagaimanapun, contoh Jakarta adalah tentang menggunakan sintaks <sql: query> daripada hanya menyematkan kode Java, dan saya setuju itu adalah cara yang jauh lebih bersih untuk melakukannya. Seseorang seharusnya tidak perlu memanggil forName () dan getConnection () secara eksplisit, bukan? Tetapi metode hack-the-driver-code-in-the-presentation-layer lama yang jelek bekerja dengan baik, coba pertama. Jadi saya bingung, tetapi sekarang ini lebih merupakan masalah pemeliharaan / estetika daripada "Ini rusak, perbaiki, atau tingkatkan keterampilan Anda membalik burger."
Rick Wayne
IMHO menggunakan sql taglib hanya sedikit lebih baik daripada melakukan JDBC di scriptlets ... lebih suka pola pengontrol / tampilan di mana hal-hal db dilakukan di muka dan JSP hanya menampilkan barang. Masing-masing untuk mereka sendiri, dan menggunakan sql: query membuat semuanya tetap sederhana :) (ish)
araqnid
Saya tidak pernah mengatakan bahwa saya setuju dengan menggunakan taglib SQL JSTL, tapi itu bukan topik yang membahas topik ini.
BalusC
2
Terima kasih, format string koneksi JDBC Anda sangat membantu!
Jay Taylor
15
url="jdbc:postgresql//localhost:5432/mmas"

URL tersebut terlihat salah, apakah Anda memerlukan yang berikut ini?

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

Saya lupa menambahkan Driver JDBC PostgreSQL ke dalam proyek saya ( Mvnrepository ).

Gradle :

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

Maven :

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

Anda juga dapat men-download dengan JAR dan impor ke proyek Anda secara manual.

Manuel Schmitzberger
sumber
12

Saya menghadapi masalah serupa. Proyek saya dalam konteks adalah Proyek Web Dinamis (Java 8 + Tomcat 8) dan kesalahan untuk pengecualian Driver PostgreSQL: Tidak ditemukan driver yang sesuai

Itu diselesaikan dengan menambahkan Class.forName("org.postgresql.Driver")sebelum memanggil getConnection()metode

Ini Kode Sampel saya:

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());
        }
Vinayak Singh
sumber
3

Saya menemukan tip followig bermanfaat, untuk menghilangkan masalah ini di Tomcat -

pastikan untuk memuat driver terlebih dahulu dengan melakukan Class.forName ("org.postgresql.Driver"); dalam kode Anda.

Ini dari pos - https://www.postgresql.org/message-id/[email protected]

Kode jdbc bekerja dengan baik sebagai program mandiri tetapi, di TOMCAT itu memberikan kesalahan -'Tidak ada driver yang cocok ditemukan '

Seorang Venkatraman
sumber
Harap tidak ada tautan hanya jawaban - jelaskan secara singkat apa yang ada di balik itu!
monamona
Tautan ke sebuah solusi diperbolehkan, tetapi harap pastikan jawaban Anda berguna tanpanya: tambahkan konteks di sekitar tautan sehingga sesama pengguna Anda akan tahu apa itu dan mengapa itu ada, lalu kutip bagian paling relevan dari halaman Anda ' menautkan ulang jika halaman target tidak tersedia. Jawaban yang tidak lebih dari sebuah tautan dapat dihapus .
Peter
1

Perlu dicatat bahwa ini juga dapat terjadi ketika Windows memblokir unduhan yang dianggap tidak aman. Ini dapat diatasi dengan mengklik kanan file jar (seperti ojdbc7.jar), dan mencentang kotak 'Buka blokir' di bagian bawah.

Dialog Properti File JAR Windows :
Dialog Properti File JAR Windows

pengguna7994072
sumber
1

Selain menambahkan konektor MySQL JDBC, pastikan context.xml (jika tidak dibuka di folder webapps Tomcat) dengan definisi koneksi DB Anda termasuk dalam direktori conf Tomcats.

feistyfawn
sumber
1

Kesalahan yang sangat konyol yang mungkin terjadi adalah penambahan spasi pada awal koneksi URL JDBC.

Yang saya maksud:-

misalkan Anda memiliki kesalahan karena diberikan url jdbc seperti

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

(Perhatikan ada spasi di staring url, ini akan membuat error)

cara yang benar adalah:

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

(Perhatikan tidak ada spasi di tatapan, Anda boleh memberi spasi di akhir url tetapi aman untuk tidak melakukannya)

ankkol2011
sumber
0

Saya menggunakan jruby, dalam kasus saya, saya buat di bawah config / initializers

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'

atau di mana pun pengemudi Anda, dan hanya itu!

Ale Guro
sumber
0

Saya mengalami masalah yang sama persis saat mengembangkan aplikasi Spring Boot di STS, tetapi pada akhirnya menerapkan paket perang ke WebSphere (v.9). Berdasarkan jawaban sebelumnya, situasi saya unik. ojdbc8.jar ada di folder WEB-INF / lib saya dengan set pemuatan kelas Parent Last, tetapi selalu dikatakan gagal menemukan driver yang sesuai.

Masalah utama saya adalah saya menggunakan kelas DataSource yang salah karena saya hanya mengikuti tutorial / contoh online. Temukan petunjuknya berkat komentar David Dai atas pertanyaannya sendiri di sini: Spring JDBC Tidak dapat memuat kelas driver JDBC [oracle.jdbc.driver.OracleDriver]

Juga kemudian ditemukan contoh guru musim semi dengan driver khusus Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Contoh yang melempar kesalahan menggunakan org.springframework.jdbc.datasource.DriverManagerDataSourceberdasarkan contoh umum.

@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;
    }
}

Dan contoh yang dikoreksi menggunakan 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;
    }
}
Ryan D
sumber
0

Saya mengalami masalah yang sama dengan sumber data mysql menggunakan data musim semi yang akan berfungsi di luar tetapi memberi saya kesalahan ini saat digunakan di tomcat.

Kesalahan hilang ketika saya menambahkan jar driver mysql-connector-java-8.0.16.jar ke folder jres lib / ext

Namun saya tidak ingin melakukan ini dalam produksi karena takut mengganggu aplikasi lain. Definisi kelas pengemudi yang jelas memecahkan masalah ini untuk saya

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

Jalankan javadengan CLASSPATHvariabel lingkungan yang menunjuk ke file JAR driver, mis

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

Di mana drivers/mssql-jdbc-6.2.1.jre8.jarjalur ke file driver (misalnya JDBC untuk SQL Server ).

Ini ConnectURLadalah aplikasi sampel dari driver itu ( samples/connections/ConnectURL.java), yang dikompilasi melalui javac ConnectURL.java.

kenorb
sumber
0

Dalam kasus saya, saya sedang mengerjakan proyek Java dengan Maven dan mengalami kesalahan ini. Di file pom.xml Anda, pastikan Anda memiliki dependensi ini

<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>

dan di mana Anda membuat koneksi memiliki sesuatu seperti ini

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;
    }
Justice Bringer
sumber
Anda tidak perlu menelepon Class.forName. DriverManagerharus bisa menemukannya.
Stephen C
Kamu mungkin benar. Java bukan bahasa pengkodean utama saya.
Justice Bringer
0

Anda akan mendapatkan kesalahan yang sama jika tidak ada definisi Sumber daya yang disediakan di suatu tempat untuk aplikasi Anda - kemungkinan besar baik dalam konteks pusat.xml, atau file konteks individu di conf / Catalina / localhost. Dan jika menggunakan file konteks individual, berhati - hatilah karena Tomcat menghapusnya secara bebas kapan pun Anda menghapus / membatalkan penerapan file .war yang sesuai.

em_bo
sumber
0

Tidak peduli berapa umur utas ini, orang akan terus menghadapi masalah ini.

Kasus Saya: Saya memiliki pengaturan OpenJDK dan maven terbaru (pada saat posting). Saya telah mencoba semua metode yang diberikan di atas, dengan / keluar maven dan bahkan solusi pada kiriman saudara di StackOverflow. Saya tidak menggunakan IDE atau apa pun, menjalankan CLI kosong untuk mendemonstrasikan hanya logika inti.

Inilah yang akhirnya berhasil.

  • Unduh driver dari situs resmi. (bagi saya itu MySQL https://www.mysql.com/products/connector/ ). Gunakan rasa Anda di sini.
  • Unzip file jar yang diberikan di direktori yang sama dengan proyek java Anda. Anda akan mendapatkan struktur direktori seperti ini. Jika Anda melihat dengan cermat, ini persis berkaitan dengan apa yang kami coba lakukan dengan menggunakan Class.forName(....). File yang kita inginkan adalahcom/mysql/jdbc/Driver.class

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

  • Kompilasi program java yang berisi kode tersebut.
javac App.java
  • Sekarang muat direktur sebagai modul dengan menjalankan
java --module-path com/mysql/jdbc -cp ./ App

Ini akan memuat paket (diekstrak) secara manual, dan program java Anda akan menemukan kelas Driver yang diperlukan.


  • Perhatikan bahwa ini dilakukan untuk mysqldriver, driver lain mungkin memerlukan sedikit perubahan.
  • Jika vendor Anda menyediakan .debgambar, Anda bisa mendapatkan botolnya dari/usr/share/java/your-vendor-file-here.jar
Yash Kumar Verma
sumber
-1

Saya mengalami masalah ini dengan memasukkan file XML ke dalam file yang src/main/resourcessalah, saya menghapusnya dan kemudian semuanya kembali normal.

jerryleooo
sumber