web-dev-qa-db-ja.com

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

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

アプリ自体はPostgresとうまく通信するので、データベースが起動し、ユーザーがアクセスできること、その他すべてのことを知っています。私がやろうとしているのは、追加したJSPのデータベースクエリです。 Tomcat datasource example の設定サンプルをほとんど使用しました。必要なtaglibは適切な場所にあります。taglibrefがあればエラーは発生しないため、これらのJARが見つかります。 postgres jdbcドライバー、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>

<Host>内の$ CATALINA_HOME/conf/server.xmlからの関連セクション:<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]
68
Rick Wayne

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

この例外には、基本的にtwoの原因があります。

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

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

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

_Class.forName("com.example.jdbc.Driver");
_

..コード内でbefore最初のDriverManager#getConnection()呼び出しの前に、必ずnotスローされるClassNotFoundExceptionを飲み込み/無視し、例外が発生しなかったかのようにコードフローを続行します。 Tomcatの接続プール用のJDBCドライバーはどこに配置する必要がありますか も参照してください。

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

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

PostgreSQLの場合、文書化されています here

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

  • _jdbc:postgresql:database_
  • _jdbc:postgresql://Host/database_
  • _jdbc:postgresql://Host:port/database_

MySQLの場合、文書化されています here

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

_jdbc:mysql://[Host1][:port1][,[Host2][:port2]]...[/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]_

Oracleの場合、文書化されています here

URL構文は2つあり、古い構文はSIDでのみ機能し、新しい構文はOracleサービス名で機能します。

古い構文_jdbc:Oracle:thin:@[Host][:PORT]:SID_

新しい構文_jdbc:Oracle:thin:@//[Host][:PORT]/SERVICE_


こちらもご覧ください:

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

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

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

同様の問題に直面しました。コンテキスト内の私のプロジェクトはダイナミック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());
        }
7
Vinayak Singh

PostgreSQL JDBC Driverをプロジェクトに追加するのを忘れていました 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>

ダウンロード the[〜#〜] jar [〜#〜]を手動でプロジェクトにインポートすることもできます。

Tomcatでこの問題を解消するために、次のヒントが役立ちました-

最初にClass.forName( "org.postgresql.Driver")を実行して、必ずドライバーをロードしてください。あなたのコードで。

これはポストからです- https://www.postgresql.org/message-id/[email protected]

Jdbcコードはスタンドアロンプ​​ログラムとしては正常に機能しましたが、Tomcatでは「適切なドライバーが見つかりません」というエラーが発生しました

3
A Venkatraman

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

Windows JARファイルのプロパティダイアログ
Windows JAR File Properties Dialog

1
user7994072

結果として起こり得る非常に愚かな間違いは、JDBC URL接続の開始時にスペースを追加することです。

私が意味するのは:-

次のような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
ankkol2011

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

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

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

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

私は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
Ale Guro

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

私の究極の問題は、オンラインチュートリアル/例に従っているだけなので、誤ったDataSourceクラスを使用していたことです。ここで彼自身の質問に対するデビッド・ダイのコメントのおかげでヒントが見つかりました: Spring JDBC 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
Ryan D

Java環境変数がドライバーのJARファイルを指している状態でCLASSPATHを実行します。

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

ここで、drivers/mssql-jdbc-6.2.1.jre8.jarはドライバーファイルへのパスです(例: SQL Server用のJDBC )。

ConnectURLは、そのドライバーのサンプルアプリ(samples/connections/ConnectURL.Java)であり、javac ConnectURL.Javaを介してコンパイルされます。

0
kenorb

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

0
feistyfawn

この問題は、XMLファイルをsrc/main/resources間違って、私はそれを削除し、すべて正常に戻った。

0
Jerry