Kötü şöhretli java.sql.SQLException: Uygun sürücü bulunamadı


90

Mevcut bir Tomcat 5.5 uygulamasına veritabanı etkin bir JSP eklemeye çalışıyorum (GeoServer 2.0.0, yardımcı oluyorsa).

Uygulamanın kendisi Postgres ile gayet iyi konuşuyor, bu yüzden veritabanının hazır olduğunu, kullanıcının ona erişebileceğini, tüm bu güzel şeyleri biliyorum. Yapmaya çalıştığım şey, eklediğim bir JSP'deki bir veritabanı sorgusu. Ben yapılandırma örneğini kullandımTomcat veri kaynağı örneğindeki örneğini hemen hemen kutunun dışında kullandım. Gerekli taglib'ler doğru yerdedir - sadece taglib refs'e sahipsem hiçbir hata oluşmaz, bu yüzden bu JAR'ları bulur. Postgres jdbc sürücüsü, postgresql-8.4.701.jdbc3.jar $ CATALINA_HOME / common / lib dizinindedir.

İşte JSP'nin zirvesi:

<%@ 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'deki ilgili bölüm, içinde <Host>sırayla <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>

Bu satırlar webapps / gs2 / WEB-INF / web.xml'deki etiketin son satırlarıdır:

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

Son olarak, istisna:

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

Yanıtlar:


109

Kötü şöhretli java.sql.SQLException: Uygun sürücü bulunamadı

Bu istisnanın temelde iki nedeni olabilir:

1. JDBC sürücüsü yüklenmemiş

JDBC sürücüsünün sunucunun kendi /libklasörüne yerleştirildiğinden emin olmanız gerekir .

Veya, aslında sunucu tarafından yönetilen bir bağlantı havuzu veri kaynağı kullanmıyorsanız, ancak WAR'da manuel olarak uğraşıyorsanız DriverManager#getConnection(), JDBC sürücüsünü WAR'lara yerleştirmeniz /WEB-INF/libve gerçekleştirmeniz gerekir ..

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

.. ilk çağrıdan önce kodunuzda , onun tarafından atılabilecek hiçbir DriverManager#getConnection()şeyi yutmadığınızdan / görmezden gelmediğinizdenClassNotFoundException ve istisnai bir şey olmamış gibi kod akışına devam ettiğinizden emin olun . Ayrıca bkz . JDBC sürücüsünü Tomcat'in bağlantı havuzu için nereye yerleştirmeliyim?

2. Veya, JDBC URL'si yanlış sözdiziminde

JDBC URL'sinin JDBC sürücü belgelerine uygun olduğundan emin olmanız ve genellikle büyük / küçük harfe duyarlı olduğunu aklınızda bulundurmanız gerekir. JDBC URL'si yüklenen sürücülerin hiçbiri trueiçin dönmediğinde Driver#acceptsURL(), tam olarak bu istisnayı da alırsınız.

PostgreSQL durumunda burada belgelenmiştir .

JDBC ile, bir veritabanı bir URL (Tekdüzen Kaynak Konum Belirleyicisi) ile temsil edilir. PostgreSQL ™ ile bu, aşağıdaki biçimlerden birini alır:

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

MySQL durumunda burada belgelenmiştir .

Bir MySQL sunucusuna bağlanmak için bir JDBC URL'sinin genel biçimi aşağıdaki gibidir, köşeli parantez ( [ ]) içindeki öğeler isteğe bağlıdır:

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

Durumunda Oracle burada belgelenmiştir .

2 URL sözdizimi vardır, eski sözdizimi yalnızca SID ile çalışır ve yenisi Oracle hizmet adı ile çalışır.

Eski sözdizimi jdbc:oracle:thin:@[HOST][:PORT]:SID

Yeni sözdizimi jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


Ayrıca bakınız:


Teşekkürler beyler! Üzgünüm 1. deneme OP'de değildi, sadece jdbc: postgresql: mmas (ve diğerlerini denedim!). Ne yazık ki, araqnid'in URL'si ile aynı sonuç. Dün gece tablib öğelerini (ick) gömülü Java ile değiştirdim ve bu iyi çalışıyor: {Class.forName ("org.postgresql.Driver") deneyin. NewInstance (); con = DriverManager.getConnection ("jdbc: postgresql: mmas", "mmas", "passwd"); stmt = con.createStatement (); rs = stmt.executeQuery ("yada yada seç"); if (rs! = null && rs.next ()) {// reap fame, fortune, glory, babes Jakarta örneği w / taglibs idi, ben de bu şekilde başladım.
Rick Wayne

Ah. Kod biçimlendirmesiyle çok fazla yorum yok. Ahem. Yeni başlayanım görünüyor mu? (ZIIP!) Her neyse, Jakarta örneği yalnızca Java kodunu gömmek yerine <sql: query> sözdizimini kullanmakla ilgiliydi ve bunun çok daha temiz bir yol olduğunu kabul ediyorum. Açıkça forName () ve getConnection () 'ı çağırmaya gerek yoktur, değil mi? Ancak eski çirkin sunu katmanındaki sürücü kodunu hackleme yöntemi işe yaradı, ilk deneyin. Bu yüzden şaşkınım, ama şimdi sorun "Bu bozuk, düzeltin veya burger çevirme becerilerinizi tazeleyin" den daha çok bir bakım / estetik sorunu.
Rick Wayne

Sql taglib'i kullanan IMHO, betiklerde JDBC yapmaktan sadece biraz daha iyidir ... daha çok, db işlemlerinin önceden yapıldığı ve JSP'nin sadece bir şeyler görüntülediği bir denetleyici / görünüm modelini tercih eder. Her biri kendi başına ve sql: query kullanımı işleri basitleştirir :) (ish)
araqnid

JSTL SQL taglib'i kullanmayı kabul ettiğimi hiç söylemedim, ancak bu konunun konusu bu değil.
BalusC

2
Teşekkürler, JDBC bağlantı dizesi biçimleriniz son derece yardımcı oldu!
Jay Taylor

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

Bu URL yanlış görünüyor, aşağıdakilere ihtiyacınız var mı?

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

15

PostgreSQL JDBC Sürücüsünü projeme ( Mvnrepository ) eklemeyi unuttum .

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>

Ayrıca edebilirsiniz indirmek JAR elle projenize ve ithalat.


12

Ben de benzer bir sorunla karşılaştım. Projem bağlamında Dinamik Web Projesi (Java 8 + Tomcat 8) ve hata PostgreSQL Sürücü istisnası içindir: Uygun sürücü bulunamadı

Yöntem Class.forName("org.postgresql.Driver")çağırmadan önce eklenerek çözüldügetConnection()

İşte Örnek Kodum:

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

Bu sorunu Tomcat'te ortadan kaldırmak için aşağıdaki ipucunu yararlı buldum -

önce bir Class.forName ("org.postgresql.Driver") yaparak sürücüyü yüklediğinizden emin olun; kodunuzda.

Bu yazıdan - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

Jdbc kodu bağımsız bir program olarak iyi çalıştı, ancak TOMCAT'ta -'Uygun sürücü bulunamadı 'hatası verdi


Lütfen sadece cevaplarla bağlantı kurmayın - bunun arkasında ne olduğunu kısaca açıklayın!
monamona

Bir çözüme bağlantı memnuniyetle karşılanır, ancak lütfen cevabınızın o olmadan yararlı olduğundan emin olun: Bağlantının etrafına bağlam ekleyin, böylece kullanıcı arkadaşlarınız bunun ne olduğu ve neden orada olduğu konusunda fikir sahibi olurlar, ardından sayfanın en alakalı bölümünü alıntılayın ' hedef sayfanın mevcut olmaması durumunda yeniden bağlanma. Bir bağlantıdan biraz daha fazla olan cevaplar silinebilir .
Peter

1

Bunun, Windows güvenli olmadığını düşündüğü indirmeleri engellediğinde de meydana gelebileceğini belirtmekte fayda var. Bu, jar dosyasına sağ tıklayarak (ojdbc7.jar gibi) ve alttaki 'Engellemeyi Kaldır' kutusunu işaretleyerek giderilebilir.

Windows JAR Dosya Özellikleri İletişim Kutusu :
Windows JAR Dosya Özellikleri İletişim Kutusu


1

MySQL JDBC bağlayıcısını eklemenin yanı sıra, DB bağlantı tanımlarınızla context.xml'nin (Tomcat webapps klasöründe açılmamışsa) Tomcats conf dizinine dahil edilmesini sağlayın.


1

JDBC URL bağlantısının başlangıcına boşluk eklemesi olası bir aptalca hata olabilir.

Demek istediğim ... dir:-

jdbc url'si gibi bir hata yaptığınızı varsayalım

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

(URL'ye bakarken boşluk olduğuna dikkat edin, bu hataya neden olur)

doğru yol şöyle olmalıdır:

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

(Bakarken boşluk olmadığına dikkat edin, url'nin sonunda boşluk bırakabilirsiniz, ancak güvenli değildir)


0

Jruby kullanıyordum, benim durumumda config / initializers altında oluşturdum

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'

veya sürücünüz nerede olursa olsun, hepsi bu!


0

STS'de bir Spring Boot uygulaması geliştirirken, ancak nihayetinde paketlenmiş savaşı WebSphere'e (v.9) dağıtırken tam olarak bu sorunu yaşadım. Önceki cevaplara göre durumum benzersizdi. ojdbc8.jar, Ebeveyn Son sınıf yükleme kümesiyle WEB-INF / lib klasörümdeydi, ancak her zaman uygun sürücüyü bulamadığını söylüyor.

Nihai sorunum, yanlış DataSource sınıfını kullanmamdı çünkü sadece çevrimiçi öğreticiler / örneklerle birlikte takip ediyordum. Buradaki kendi sorusuna ilişkin David Dai yorumu sayesinde ipucu buldu: Spring JDBC JDBC sürücü sınıfı [oracle.jdbc.driver.OracleDriver] yüklenemedi

Ayrıca daha sonra Oracle'a özgü sürücü ile bahar guru örneği bulundu: https://springframework.guru/configuring-spring-boot-for-oracle/

org.springframework.jdbc.datasource.DriverManagerDataSourceGenel örneklere dayalı olarak hata veren örnek.

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

Ve a kullanarak düzeltilmiş örnek 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

Dışarıda çalışacak bahar verilerini kullanan mysql veri kaynağı ile aynı sorunu yaşıyordum, ancak tomcat üzerine konuşlandırıldığında bana bu hatayı verdi.

Sürücü kavanozu mysql-connector-java-8.0.16.jar'ı jres lib / ext klasörüne eklediğimde hata ortadan kalktı

Ancak diğer uygulamalara müdahale etme korkusuyla bunu üretimde yapmak istemedim. Sürücü sınıfını tanımlayan açıklık bu sorunu benim için çözdü

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

0

Run javaile CLASSPATHsürücü JAR dosyası, örneğin çevresel değişken işaret

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

Nerede drivers/mssql-jdbc-6.2.1.jre8.jarSürücü dosyasına giden yol (örn . SQL Server için JDBC ).

Bu ConnectURLsürücüden ( samples/connections/ConnectURL.java) derlenen örnek uygulama javac ConnectURL.java.


0

Benim durumumda Maven ile bir Java projesi üzerinde çalışıyordum ve bu hatayla karşılaştım. Pom.xml dosyanızda bu bağımlılıklara sahip olduğunuzdan emin olun

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

ve bağlantı kurduğunuz yerde böyle bir şey var

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

Aramana gerek yok Class.forName. DriverManageronu bulabilmeli.
Stephen C

Haklı olabilirsin. Java benim ana kodlama dilim değil.
Justice Bringer

0

Uygulamanız için bir yerde bir Kaynak tanımı sağlanmadıysa aynı hatayı alırsınız - büyük olasılıkla ya merkezi context.xml'de ya da conf / Catalina / localhost'taki tek bir bağlam dosyasında. Ayrıca, bağımsız bağlam dosyaları kullanıyorsanız , Tomcat'in ilgili .war dosyasını her kaldırdığınızda / dağıttığınızda bunları serbestçe sildiğine dikkat edin .


0

Bu iplik kaç yaşında olursa olsun, insanlar bu sorunla yüzleşmeye devam edecek.

Benim Durumum: En son (yayınlama sırasında) OpenJDK ve maven kurulumuna sahibim. Yukarıda verilen tüm yöntemleri, maven ile / out ve hatta StackOverflow'daki kardeş gönderilerindeki çözümleri denedim. Herhangi bir IDE veya başka bir şey kullanmıyorum, sadece temel mantığı göstermek için çıplak CLI'den çalıştırıyorum.

İşte sonunda işe yarayan şey.

  • Sürücüyü resmi siteden indirin. (benim için MySQL oldu https://www.mysql.com/products/connector/ ). Lezzetinizi burada kullanın.
  • Verilen jar dosyasını java projenizle aynı dizinde açın. Bunun gibi bir dizin yapısı elde edersiniz. Dikkatlice bakarsanız, bu tam olarak ne yapmaya çalıştığımızla ilgilidir Class.forName(....). İstediğimiz dosyacom/mysql/jdbc/Driver.class

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

  • Kodu içeren java programını derleyin.
javac App.java
  • Şimdi yönetmeni bir modül olarak yükleyin.
java --module-path com/mysql/jdbc -cp ./ App

Bu, (çıkarılan) paketi manuel olarak yükler ve java programınız gerekli Sürücü sınıfını bulur.


  • Bunun mysqlsürücü için yapıldığını , diğer sürücülerin küçük değişiklikler gerektirebileceğini unutmayın.
  • Satıcınız bir .debgörüntü sağlarsa, kavanozu/usr/share/java/your-vendor-file-here.jar

-1

Bu sorunla bir XML dosyasını src/main/resourcesyanlış yerleştirerek karşılaştım , onu sildim ve ardından normale döndüm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.