105

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

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

$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]
4

19 に答える 19

122

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

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

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

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

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

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

..最初の呼び出しののコードで、それによってスローされる可能性のあるものを飲み込んだり無視したりせ、例外が何も起こらなかったかのようにコード フローを続行するようにします。Tomcat の接続プール用の JDBC ドライバーはどこに置く必要がありますか?も参照してください。DriverManager#getConnection()ClassNotFoundException

#2。または、JDBC URL の構文が正しくありません

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

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

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

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

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

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

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

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

SID のみで機能する古い構文と、Oracle サービス名を使用する新しい構文の 2 つの URL 構文があります。

古い構文jdbc:oracle:thin:@[HOST][:PORT]:SID

新しい構文jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


###こちらもご覧ください:

于 2009-12-16T00:28:33.570 に答える
15
url="jdbc:postgresql//localhost:5432/mmas"

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

url="jdbc:postgresql://localhost:5432/mmas"
于 2009-12-15T23:56:44.200 に答える
3

Tomcatでこの問題を解決するには、次のヒントが役立つことがわかりました-

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

これは投稿からのものです - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

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

于 2018-01-19T15:52:05.383 に答える
1

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

私の場合: 最新 (投稿時) の 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 プログラムは必要な Driver クラスを見つけます。


  • これはドライバーに対して行われたものでありmysql、他のドライバーではマイナーな変更が必要になる場合があることに注意してください。
  • ベンダーが.deb画像を提供している場合は、jar を次から入手できます。/usr/share/java/your-vendor-file-here.jar
于 2020-10-17T08:59:09.363 に答える
0

私の場合、Maven を使用して Java プロジェクトに取り組んでいて、このエラーが発生しました。pom.xml ファイルで、この依存関係があることを確認してください

<dependencies>
    <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;
    }
于 2020-05-26T19:42:01.267 に答える
0

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

于 2020-09-18T21:40:46.627 に答える
0

概要:

  • Soln2 (推奨)::

    • 1. mysql-connector-java-8.0.28.jarにファイルを入れます<where you install your Tomcat>/lib
  • Soln1::

    • 1. mysql-connector-java-8.0.28.jarにファイルを入れますWEB-INF/lib
    • 2. Class.forName("com.mysql.cj.jdbc.Driver");サーブレット Java コードで使用します。

Soln1 (オリ アンズ) //-20220304

要するに:

  1. mysql-connector-java-8.0.28.jarファイルがWEB-INF/lib
  2. 必ず使用してくださいClass.forName("com.mysql.cj.jdbc.Driver");

jdbc 接続用の jar とクラス


追加のメモ(重要ではありません)、私の試みに基づいています(間違っている可能性があります)::

  • 1.1 ジャーを直接中に入れてもJava build pathうまくいきません

  • 1.2. 瓶を入れてもData management > Driver Def > MySQL JDBC Driver > then add it as library to Java Build pathうまくいきません。

  • 1.3 => の中にある必要がありますWEB-INF/lib(理由はわかりません)

  • バージョン 1.4 を使用するとmysql-connector-java-8.0.28.jar機能します。Eclipse 設定で使用可能なバージョン 5.1 のみが重要ではありませんMySQL JDBC Driver。無視してください。

    < Eclipse Database Management Perspective を使用して MySql 8.0 データベースに接続する方法を参照してください>

  •     Class.forName("com.mysql.cj.jdbc.Driver");
        Class.forName("com.mysql.jdbc.Driver");
    

    どちらも機能しますが、Class.forName("com.mysql.jdbc.Driver");は非推奨です。

    Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
    

    < https://www.yawintutor.com/no-suitable-driver-found-for-jdbcmysql-localhost3306-testdb/を参照>

  • MySQL データベースに接続する場合は、MySQL Web サイトから無料で入手できる Connector/} という名前のタイプ 4 ドライバーを使用できます。ただし、このドライバーは通常、Tomcat の lib ディレクトリに含まれています。そのため、通常、このドライバーを MySQL サイトからダウンロードする必要はありません。

    -- Murach の Java サーブレットと JSP

    著者が話しているTomcatのドライバーが見つかりませんmysql-connector-java-8.0.28.jar.. <(取り消し線) 以下の更新された回答 soln2 を参照>

  • ただし、古いバージョンの Java を使用している場合は、getConnection メソッドを呼び出す前に、Class クラスの forName メソッドを使用してドライバーを明示的にロードする必要があります。

    JDBC 4.0 でも、「適切なドライバーが見つかりません」というメッセージが表示されることがあります。その場合、Class クラスの forName メソッドを使用して、ドライバーを明示的にロードできます。ただし、ドライバーの自動読み込みが機能する場合は、通常、このメソッド呼び出しをコードから削除することをお勧めします。

    JDBC 4.0 より前の MySQL データベース ドライバーをロードする方法

    Class.forName{"com.mysql.jdbc.Driver");

    -- Murach の Java サーブレットと JSP

    システムで使用する必要Class.forName("com.mysql.cj.jdbc.Driver");があり、自動クラスローディングはありません。理由がわからない。 <(取り消し線) 以下の更新された回答 soln2 を参照>


Soln2 (更新された回答) //-20220305_12

要するに:

  • 1. mysql-connector-java-8.0.28.jarにファイルを入れます<where you install your Tomcat>/lib

    例えば:G:\pla\Java\apache-tomcat-10.0.16\lib\mysql-connector-java-8.0.28.jar

    (そして EclipseDynamic Web Projectの場合、jar は自動的にプロジェクトの内部に配置されますJava build path > Server Runtime [Apache Tomcat v10.0]。)

jar を Tomcat/lib に入れる


その他の注意事項::

soln1 の場合::

  1. mysql-connector-java-8.0.28.jarにファイルを入れますWEB-INF/lib
  2. Class.forName("com.mysql.cj.jdbc.Driver");サーブレット Java コードで使用します。

これにより、警告が作成されます。

WARNING: The web application [LearnJDBC] appears to have started a thread named [mysql-cj-abandoned-connection-cleanup] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:

< Web アプリケーション [] は、[放棄された接続クリーンアップ スレッド] com.mysql.jdbc.AbandonedConnectionCleanupThread という名前のスレッドを開始したようです >

その答えが私をsoln2に導きました。

soln2 の場合::

  1. mysql-connector-java-8.0.28.jarにファイルを入れます<where you install your Tomcat>/lib

これにより、INFO が作成されます。

INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

あなたはそれを無視することができます。

< Tomcat 9.0.0M10 で「スキャンされたが TLD が見つからなかった JAR を修正する方法」を参照してください >

(これで、何について話しているのか理解できるはずですMurach’s Java Servlets and JSP: jar in Tomcat/lib& no need for Class.forName("com.mysql.cj.jdbc.Driver");)

于 2022-03-05T04:30:57.393 に答える