悪名高いjava.sql.SQLException:適切なドライバーが見つかりません


89

データベース対応のJSPを既存のTomcat5.5アプリケーション(GeoServer 2.0.0が役立つ場合)に追加しようとしています。

アプリ自体はPostgresと問題なく通信するので、データベースが稼働していて、ユーザーがデータベースにアクセスできることはわかっています。私がやろうとしているのは、追加したJSPのデータベースクエリです。私はTomcatデータソースの例の設定例をほとんど箱から出して使用しました。必要なtaglibは適切な場所にあります。taglibrefがあればエラーは発生しないため、これらのJARが検出されます。postgresjdbcドライバー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 2016

回答:


106

悪名高いjava.sql.SQLException:適切なドライバーが見つかりません

この例外には、基本的に2つの原因が考えられます。

1.JDBCドライバーがロードされていません

JDBCドライバーがサーバー自体の/libフォルダーに配置されていることを確認する必要があります。

または、実際にはサーバー管理の接続プールデータソースを使用していないが、手動DriverManager#getConnection()でWARをいじっている場合は、JDBCドライバーをWARに配置/WEB-INF/libして。を実行する必要があります。

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

..あなたのコード内の前に最初にDriverManager#getConnection()あなたはあなたがないことを確認することにより、コールはないツバメ/いずれかを無視するClassNotFoundExceptionことによってスローさと卓越した何事もなかったかのように、コードの流れを継続することができました。Tomcatの接続プール用のJDBCドライバーをどこに配置する必要があるかも参照してください

2.または、JDBCURLの構文が間違っています

JDBC URLがJDBCドライバーのドキュメントに準拠していることを確認する必要があり、通常は大文字と小文字が区別されることに注意してください。ロードされたドライバーのいずれに対してもJDBCURLが返さtrueれないDriver#acceptsURL()場合も、まさにこの例外が発生します。

PostgreSQLの場合は、ここに記載されています

JDBCでは、データベースはURL(Uniform Resource Locator)で表されます。PostgreSQL™では、これは次のいずれかの形式を取ります。

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

MySQLの場合は、ここに記載されています

MySQLサーバーに接続するためのJDBCURLの一般的な形式は次のとおりですが、角括弧([ ])内の項目はオプションです。

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だけでした(そして私は他の人を試しました!)。悲しいことに、araqnidのURLでも、同じ結果になります。昨夜、tablibのものを(ick)組み込みJavaに交換しましたが、それは問題なく機能します。con = DriverManager.getConnection( "jdbc:postgresql:mmas"、 "mmas"、 "passwd"); stmt = con.createStatement(); rs = stmt.executeQuery( "select yada yada"); if(rs!= null && rs.next()){//名声、幸運、栄光、ベイビーを刈り取るジャカルタの例はタグリブ付きだったので、そのように始めました。
リックウェイン

ああ。コメントはコードフォーマットではあまりありません。ええと。私の初心者は見せていますか?(ZIIP!)とにかく、Jakartaの例は、Javaコードを埋め込むだけでなく、<sql:query>構文を使用することに関するものでした。これは、はるかにクリーンな方法であることに同意します。forName()とgetConnection()を明示的に呼び出す必要はありませんよね?しかし、古い醜いハック・ザ・ドライバー・コード・イン・ザ・プレゼンテーション層の方法はうまく機能しました。最初に試してみてください。だから私は困惑していますが、今では「これは壊れている、修正する、またはハンバーガーを弾くスキルを磨く」というよりも、メンテナンス/美学の問題です。
リックウェイン

sql taglibを使用するIMHOは、スクリプトレットでJDBCを実行するよりもわずかに優れています... dbが事前に実行され、JSPが表示するだけのコントローラー/ビューパターンをはるかに好みます。ただし、それぞれ独自のものであり、sql:queryを使用すると、物事が単純になります:)(ish)
araqnid 2009

JSTL SQL taglibの使用に同意すると言ったことは一度もありませんが、それはこのトピックの主題ではありません。
BalusC 2009

2
おかげで、JDBC接続文字列形式は非常に役に立ちました!
ジェイテイラー

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

そのURLは間違っているように見えますが、次のものが必要ですか?

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

15

PostgreSQL JDBCドライバーをプロジェクト(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>

JARダウンロードして、プロジェクトに手動でインポートすることもできます。


12

私も同様の問題に直面しました。コンテキスト内の私のプロジェクトは動的Webプロジェクト(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では「適切なドライバーが見つかりません」というエラーが発生しました。


答えだけのリンクはありません-その背後にあるものを簡単に説明してください!
monamona

ソリューションへのリンクは大歓迎ですが、それがなくても回答が役立つことを確認してください。リンクの周りにコンテキストを追加して、他のユーザーがそれが何であるか、なぜそこにあるのかを理解できるようにしてから、ページの最も関連性の高い部分を引用してください。ターゲットページが利用できない場合に再リンクします。リンクに過ぎない回答は削除される場合があります
ピーター

1

これは、Windowsが安全でないと見なしたダウンロードをブロックした場合にも発生する可能性があることに注意してください。これは、jarファイル(ojdbc7.jarなど)を右クリックし、下部にある[ブロック解除]ボックスをオンにすることで対処できます。

Windows JARファイルのプロパティダイアログ
WindowsJARファイルのプロパティダイアログ


1

MySQL JDBCコネクタを追加するだけでなく、DB接続定義を含むcontext.xml(Tomcat webappsフォルダに解凍されていない場合)がTomcatconfディレクトリに含まれていることを確認します。


1

結果として生じる可能性のある非常にばかげた間違いは、JDBCURL接続の開始時にスペースを追加することです。

私が意味するのは:-

jdbcのURLを次のように指定すると、間違いがあるとします。

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を使用していましたが、私の場合は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'

またはあなたのドライバーがどこにいても、それだけです!


0

STSでSpringBootアプリケーションを開発するときにこの問題が発生しましたが、最終的にはパッケージ化されたwarをWebSphere(v.9)にデプロイしました。以前の回答に基づいて、私の状況は独特でした。ojdbc8.jarは、ParentLastクラスの読み込みが設定されたWEB-INF / libフォルダーにありましたが、適切なドライバーが見つからなかったと常に表示されます。

私の最終的な問題は、オンラインチュートリアル/例をたどっていたため、間違ったDataSourceクラスを使用していたことでした。ここで彼自身の質問に対するDavidDaiのコメントのおかげでヒントが見つかりました:SpringJDBCはJDBCドライバークラスをロードできませんでした[oracle.jdbc.driver.OracleDriver]

また、後でOracle固有のドライバーを使用したSpring Guruの例が見つかりました: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

私は外部で動作するSpringデータを使用するmysqlデータソースで同じ問題を抱えていましたが、Tomcatにデプロイするとこのエラーが発生しました。

ドライバーjarmysql-connector-java-8.0.16.jarをjreslib / extフォルダーに追加すると、エラーはなくなりました。

ただし、他のアプリケーションに干渉することを恐れて、本番環境でこれを実行したくありませんでした。ドライバークラスを明示的に定義すると、この問題が解決しました

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

0

ドライバーのJARファイルを指す環境変数を使用して実行javaCLASSPATHます。

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

drivers/mssql-jdbc-6.2.1.jre8.jarドライバファイルへのパスはどこにありますか(たとえば、JDBC for for SQL Server)。

ConnectURLそのドライバからのサンプルアプリケーション(あるsamples/connections/ConnectURL.java介してコンパイル)javac ConnectURL.java


0

私の場合、MavenでJavaプロジェクトに取り組んでいて、このエラーが発生しました。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.forNameDriverManagerそれを見つけることができるはずです。
スティーブンC

君の言う通りかもね。Javaは私の主要なコーディング言語ではありません。
ジャスティスブリンガー

0

アプリのどこかにリソース定義が提供されていない場合、これと同じエラーが発生します。おそらく、中央のcontext.xmlか、conf / Catalina / localhostの個々のコンテキストファイルのいずれかにあります。また、個々のコンテキストファイルを使用する場合は、対応する.warファイルを削除/アンデプロイするたびにTomcatがそれらを自由に削除することに注意してください。


0

このスレッドがいくら古くなっても、人々はこの問題に直面し続けるでしょう。

私の場合:最新の(投稿時の)OpenJDKとMavenのセットアップがあります。StackOverflowの姉妹投稿で、Mavenの有無にかかわらず、上記のすべての方法を試しました。私は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プログラムが必要なDriverクラスを見つけます。


  • これはmysqlドライバーに対して行われたことに注意してください。他のドライバーでは小さな変更が必要になる場合があります。
  • ベンダーが.debイメージを提供している場合は、からjarを入手できます。/usr/share/java/your-vendor-file-here.jar

-1

XMLファイルをsrc/main/resources間違って配置することでこの問題が発生しました。削除してから、すべて通常の状態に戻しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.