web-dev-qa-db-ja.com

Tomcat 8-Java.sql.SQLException:接続URL 'jdbc:mysql:// xxx / myApp'のクラス ''のJDBCドライバーを作成できません

私は自分の問題の解決策を見つけるためにウェブのあちこちを見ていましたが、運がありませんでした! :(

MySQLデータベース(接続プール)に接続して、Tomcat 8サーバーにデプロイできるサーブレットを開発しようとしています。

次のようにMETA-INFにcontext.xmlファイルがあります。

<?xml version="1.0" encoding="UTF-8"?>
   <Context antiJARLocking="true" path="/DBConnectionPoolTest">
       <Resource name="jdbc/testdb"
                 auth="Container"
                 type="javax.sql.DataSource"
                 username="xxx" password="xxx"
                 driverclassname="com.mysql.jdbc.Driver"
                 url="jdbc:mysql://xxx/myApp"
                 maxactive="10"
                 maxidle="4" />
   </Context>

WEB-INFで、web.xmlファイルを作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">   
    <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/testdb</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</web-app>

最後に、サーブレットクラスでは、以下を使用します。

Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("Java:/comp/env");
dataSource = (DataSource) envContext.lookup("jdbc/testdb");
...
connection = dataSource.getConnection();

しかし、この行では、データソースから接続を取得しようとすると、次の例外が発生します。

Java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'jdbc:mysql://xxx/myApp'
t org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.Java:2065)
    at org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.Java:1939)
    at org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.Java:1412)
    at DBPoolConnectionServlet.processRequest(DBPoolConnectionServlet.Java:73)
...
Caused by: Java.sql.SQLException: No suitable driver

JDBCドライバーがないことが原因だと思ったので、mysql-connector-Java-5.1.34-bin.jar内:

  1. pom.xml依存関係
  2. Tomcat LIBフォルダー
  3. Webapp内のWEB-INF/libフォルダー

しかし運がありません。

私が間違っていることを教えていただけますか?私はとても気分が悪い... :(

私の質問を読んで(そして願わくば答えて)くれた時間をありがとうございました!!!

10
Brutus

あなたはすべてうまくやっているように見えるので、

driverClassName = "com.mysql.jdbc.Driver"(大文字が重要な場合があります)。

Mysql-connector-Java-5.1.34-bin.jarを配置します(Tomcat/libでjar拡張が検出される必要があります(これは、TomcatクラスローダーによってロードされるWebアプリケーションパスに配置しないでください)。

それが役に立たず、IDEからWebアプリケーションを起動している場合。 Tomcatフォームコンソールを起動して、アプリを手動でデプロイしてみてください。複数のTomcatがインストールされている場合、CATALINA_HOMEがmysql jarを配置したものに設定されていることを確認してください。

3
Zielu

考えられる問題は、クラスロード中にTomcatがドライバーjarを複数回検出することです。ドライバーjarは、Tomcat libディレクトリーの下にのみ必要であり、WebアプリケーションのWEB-INF/libの下には必要ありません。これらの両方の場所にドライバーjarがあると、奇妙なクラスロードの問題が発生し、「空のクラスとnullのURLを持つJDBCドライバーを作成できなかった」というエラーの形で現れました 。別のデータベースでの同様の問題については、この回答を参照してください: https://stackoverflow.com/a/11604084/220069

Update:Eclipse内からTomcatを起動しないで、EclipseとTomcatの設定が混同しないようにします(代わりに、 binディレクトリとEclipseからのjvmのリモートデバッグ)この変更を行うと、Web-INF/libとTomcat libディレクトリの両方にドライバーjarを置くことができましたが、問題ありませんでした。

1
Suketu Bhuta

Netbeans/Tomee/MySQL接続の問題を修正してFAILを解決する手順-コンテキストパス/RA7Web-1.0-SNAPSHOTにアプリケーションをデプロイしましたが、コンテキストを開始できませんでした:

  1. AppBaseの完全パス名を使用して、Tomieサーバーのserver.xmlを編集します。

     <!-- Fixed the problem of cannot deploy by providing a full path  for appBase -->`
     <Host name="localhost"  
           appBase="C:\Apache\apache-tomee-7.0.2-plume\webapps"
           unpackWARs="true" autoDeploy="true">
    
  2. 以下をプロジェクトのweb-xmlに追加します。

    <resource-ref>
        <description>Resource Allocation database</description>
        <res-ref-name>jdbc/resourcealloc</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
    
  3. 以下をContext.xmlに追加します。

      <Resource name="jdbc/resourcealloc"
            auth="Container"
            type="javax.sql.DataSource"
            username="root"
            password="mySecretPwd"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/resourcealloc"
            maxActive="15"
            maxIdle="3"/>
    
  4. 次のresources.xmlが生成されましたが、URLと一致するようにいくつかのバックスラッシュを編集する必要がありました。

      <resources>
          <Resource id="jdbc/resourcealloc" type="javax.sql.DataSource">
              jdbcDriver=com.mysql.jdbc.Driver
              password=mySecretPwd
              userName=root
              jdbcUrl=jdbc:mysql://localhost:3306/resourcealloc?zeroDateTimeBehavior=convertToNull
          </Resource>
      </resources>
    
1
Jim Reitz