質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

JNDIを使ってMysqlに接続したいが、No suitable driver になってしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 941

Cec

score 19

問題点

JNDIを使ってMysqlに接続したいのですが、'No suitable driver' になってしまいます。
色々調べて試していますが、上手くいきません。
複数定義ファイルを用いるので、設定項目を何か勘違いしているか、
設定ファイルの配置場所が間違っているのでしょうか。
参考になるサイトが古いバージョンが多い事もあり、どなたかご教示いただけると幸いです。

ヒントや、参考になるサイト情報でも構いませんので、どうぞよろしくお願いいたします。

環境

Eclipse
Tomcat 9
Maven 3.5.4
Mysql  8.0.16

ここにより詳細な情報を記載してください。

発生している問題・エラーメッセージ

Caused by: java.sql.SQLException: No suitable driver
    at java.sql/java.sql.DriverManager.getDriver(DriverManager.java:298)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:495)
    ... 32 more

該当のソースコード

pom.xml

<properties>
      <java.version>11</java.version>
      <maven.compiler.source>11</maven.compiler.source>
      <maven.compiler.target>11</maven.compiler.target>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
             :
             :
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-catalina</artifactId>
        <version>9.0.22</version>
    </dependency>
             :
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.17</version>
    </dependency>
             :
             :
    <dependency>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0.0</version>
    </dependency>
                :
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>javax.activation-api</artifactId>
        <version>1.2.0</version>
    </dependency>
  </dependencies>

    <build>
      <pluginManagement>
        <plugins>
               <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>3.1.0</version>
             </plugin>
             <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>
             <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                      <source>11</source>
                      <target>11</target>
                  </configuration>
               </plugin>
               <!-- Runs the JUnit unit tests. Creates test reports. -->
               <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
               </plugin>
               <!-- run Maven-webapp in Tomcat -->
               <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.7.7</version>
                <configuration>
                      <container>
                        <containerId>tomcat9x</containerId>
                        <type>embedded</type>
                      </container>
                </configuration>
            </plugin>
<plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <!-- <artifactId>tomcat8-maven-plugin</artifactId>
                <version>3.0-r1756463</version> -->


                <configuration>
                     <path>/upload_image_db4</path>

<!--                 <server>tomcat-localhost</server> -->
                      <server>TomcatServer</server>
                      <url>http://localhost:8080/manager/text</url>
                      <username>tomcat</username>
                       <password>password</password>       
                       <contextFile>${basedir}/src/main/webapp/META-INF/context.xml</contextFile>
                    <useTestClasspath>false</useTestClasspath>
                    <systemProperties>
                        <systemProperty>
                            <name>maven.tomcat.port</name>
                            <value>8090</value>
                        </systemProperty>
                    </systemProperties>
                </configuration>
                <executions>
                    <execution>
                        <id>tomcat7-run</id>
                        <goals>
                            <goal>run-war-only</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                    <execution>
                        <id>tomcat-shutdown</id>
                        <goals>
                            <goal>shutdown</goal>
                        </goals>
                        <phase>deploy</phase>
                        <configuration>
                            <fork>true</fork>
                            <port>8090</port>
                        </configuration>
                    </execution>
                </executions>
                                :
                                :
               </plugin>
            </plugins>
         </pluginManagement>
        <finalName>upload_image_db4</finalName>
      </build>
</project>

Maven プロジェクトのディレクトリ構成

イメージ説明
イメージ説明

Context.xml

<Context>

<Resource
        name="jdbc/Practice_MVC"
        auth="Container"
        type="javax.sql.DataSource"
        maxTotal="100"
        maxIdle="30"
        maxWaitMillis="10000"
        username="root"
        password="seri331"
        driverClassName="com.mysql.cj.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/Practice_MVC"/>
<!--         url="jdbc:mysql://mysqlserver:3306/Practice_MVC"/> -->
</Context>


web.xml

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <resource-ref>
      <description>DB Connection</description>
    <res-ref-name>jdbc/upload_image_db4</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
</web-app>

GetDataSourceLogic.java

public DataSource getDataSource() throws NamingException {
        Context initContext = new InitialContext();
        Context context  = (Context)initContext.lookup("java:/comp/env/");
        DataSource source = (DataSource)context.lookup("jdbc/upload_image_db4");//java:/comp/env/jdbc/upload_image_db4
        return source;

    }

参考にさせていただいたサイト

https://qiita.com/zaki-lknr/items/8137ac40ebd8f5bdb3c5
https://codehaus-cargo.github.io/cargo/Home.html
https://stackoverflow.com/questions/45771942/sqlexception-no-suitable-driver-found-for-jdbcmysql-between-two-maven-projects
他諸々。

追記

xebme様のおかげで、大変参考になるF&Qに辿り着いたので、載せておきます。

https://stackoverflow.com/questions/3485177/how-to-configure-tomcat-to-connect-with-mysql

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • xebme

    2019/08/21 20:09

    Tomcatのクラスパス上にドライバーが存在しないからだと思います。たいていは $CATALINA_HOME/libの配下にドライバーを置くのですが。

    キャンセル

  • Cec

    2019/08/22 06:09 編集

    xebme 様
    返信が遅くなり申し訳ありません。重要なヒントをいただき、有難うございました。web.xmlの設定にも一部問題を発見し、解決することが出来ました。感謝しております。

    キャンセル

  • xebme

    2019/08/22 18:35

    お役に立ててうれしいです。ご自分で解決されたのですから自己解決してクローズしてください。

    キャンセル

回答 2

checkベストアンサー

+1

解決済みですが情報をお知らせします。

情報

teratailのよくある回答は、WEB-INF/lib配下のドライバーをロードするためにClass.forName()を書く、ですが、この方法はメモリリークの可能性があることが知られています。

要約

  • JDBC 4.0が機能するのはシステムクラスローダーのレベル
  • webアプリケーションでは、JDBC 4.0は機能しない
    webアプリケーションでClass.forName()を使うと、ドライバーが原因でメモリリークを起こす可能性
  • JDBCドライバーは$CATALINA_HOME/libに置くことが推奨されている
    (この場合は、JDBC 4.0 の機能が有効になる。)メモリリークの可能性はなくなる。
    *(この場合は、JDBC 4.0 の機能が有効になる。)は未確認です。間違っているかもしれません。

調査すべきこと

回答するために、Java 11(9)のモジュール化でクラスローダーがどう変わったっかを調べたかったのですが、おそらく、この問題の理解に影響はないだろうと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

xebme様からの情報で解決いたしました。
有難うございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る