web-dev-qa-db-ja.com

接続URL 'null'のクラス ''のJDBCドライバーを作成できません:この例外を理解していません

なぜnullURLと言い、データベースURLを提供したときに例外で空の ''クラスを提供するのですか?

Tomcatを使用しているときに、サーブレットを介してダービーデータベースに接続しようとしています。サーブレットが実行されると、次の例外が発生します。

org.Apache.Tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

at org.Apache.Tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.Java:1452)
at org.Apache.Tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.Java:1371)
at org.Apache.Tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.Java:1044)

at servlets.servlet_1.doGet(servlet_1.Java:23) // ---> Marked the statement in servlet

at javax.servlet.http.HttpServlet.service(HttpServlet.Java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:304)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.Java:393)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:243)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:224)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:169)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:472)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:168)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:100)
at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:929)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:405)
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:964)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:515)
at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:302)
at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.Java:885)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:907)
at Java.lang.Thread.run(Thread.Java:619)
Caused by: Java.lang.NullPointerException
at Sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.Java:507)
at Sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.Java:476)
at Sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.Java:307)
at Java.sql.DriverManager.getDriver(DriverManager.Java:253)
at org.Apache.Tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.Java:1437)
... 24 more

サーブレット:

package servlets;

import Java.io.IOException;
import Java.sql.Connection;
import Java.sql.PreparedStatement;
import Java.sql.ResultSet;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.http.*;
import javax.servlet.*;
import javax.sql.DataSource;

public class servlet_1 extends HttpServlet {

    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
           // String queryString = request.getQueryString();
            System.out.println("!!!!!!!!!!!!!!!!!!!");
            Context initContext = new InitialContext();
            Context envContext = (Context)initContext.lookup("Java:comp/env");
            DataSource ds = (DataSource)envContext.lookup("jdbc/PollDatasource");
            Connection connection = ds.getConnection(); // -->LINE 23
            String sqlQuery = "select * from PollResult";
            PreparedStatement statement = connection.prepareStatement(sqlQuery);
            ResultSet set = statement.executeQuery();
            System.out.println("after the final statement");
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }
}

これはどんな例外ですか?なぜこの例外が発生するのですか?

Tomcatのcontext.xmlに次のタグを追加しました。

<Resource name="jdbc/PollDatasource" auth="Container" type="javax.sql.DataSource"
driverClassName="org.Apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll_database;create=true"
username="suhail" password="suhail"
maxActive="20" maxIdle="10" maxWait="-1" />

これはweb.xmlで:

<resource-ref>
  <description>my connection</description>
  <res-ref-name>jdbc/PollDatasource</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

どこで間違いを犯していますか?

データベースURLを示す画像。

enter image description here

注:@Bryan Pendletonによる回答の後、ドライバーをorg.Apache.derby.jdbc.ClientDriverに変更しましたが、同じ例外が発生します。 =

47
Suhail Gupta

明らかな間違いは見当たりませんが、おそらく別のアプローチがデバッグに役立つかもしれません。

グローバルTomcatの代わりに、アプリケーションコンテキストごとにデータソースを指定してみてください。

これを行うには、src/main/webapp/META-INF/context.xmlを作成します(標準のMavenディレクトリ構造を使用していると仮定しています-そうでない場合、META-INFフォルダーは、 WEB-INFディレクトリ)。 META-INF/context.xmlファイルの内容は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>

<Context path="/myApp" docBase="myApp"
   crossContext="true" reloadable="true" debug="1">

<Resource name="jdbc/PollDatasource" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.Apache.derby.jdbc.ClientDriver"
          url="jdbc:derby://localhost:1527/poll_database;create=true"
          username="suhail" password="suhail" maxActive="20" maxIdle="10" maxWait="-1"/>
</Context>

明らかに、パスとdocBaseはアプリケーションの特定の詳細に一致する必要があります。

このアプローチを使用すると、Tomcatのcontext.xmlファイルでデータソースの詳細を指定する必要がありません。ただし、同じデータベースと通信する複数のアプリケーションがある場合は、アプローチがより理にかなっています。

とにかく、これを旋回させて、それが違いを生むかどうか確かめてください。それはあなたのアプローチで何が悪いのかを知る手がかりになるかもしれません。

28
Taskmaster

いくつかの修正:

  1. 環境に適したドライバークラス名を使用します。アウトプロセスのDerbyサーバーを使用している場合、ClientDriver(およびderbyclient.jarを使用する必要があります)、ホスト名、ポートなどが必要です。 Derbyサーバーを処理する場合、derby.jar、EmbeddedDriver、および埋め込みデータベースに適したURLが必要です。

  2. ドライバのJARファイルは、Tomcatのlib/ディレクトリにのみ配置してください。

  3. Tomcatのconf/context.xmlには何も入れないでください:本当に理由はありません。代わりに、WebアプリのMETA-INF/context.xmlを使用して<Resource>を定義します。

エラー"Cannot create JDBC driver of class '' for connect URL 'null'は通常、JDBCドライバーが適切な場所にない(またはTomcatのlib/ディレクトリだけでなくwebappのWEB-INF/lib/ディレクトリにもある場所が多すぎる)ために発生します。適切な場所に適切なドライバJARファイルがあることを確認してください。

7

次の2つのことは一致しません。

driverClassName="org.Apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll database;create=true"

EmbeddedDriverを使用している場合、URLにネットワーク構文を含めることはできません。

逆に、ネットワーク構文を使用している場合は、ClientDriverを使用する必要があります。

http://db.Apache.org/derby/docs/10.8/getstart/rgsquck35368.html

5
Bryan Pendleton

context.xmlを間違ったパスに配置したため、この問題が発生していました。

./src/main/resources/META-INF/context.xml

正しいパスは次のとおりです。

./src/main/webapp/META-INF/context.xml
3
vadipp

Eclipseを使用している場合は、Eclipseパッケージエクスプローラーで作成されたサーバープロジェクトからcontext.xmlを変更する必要があります。 EclipseでTomcatを使用する場合、有効なのはそれだけです。その他は無視されるか上書きされます

2
jesantana

TomcatをOracleに対して使用すると、同様の問題が発生しました。 Iは、ディスク上のMETA-INFディレクトリにCONTEXT.XMLを持っています。ただし、このファイルはEclipseプロジェクトでは表示されませんでした。 F5リフレッシュで単純なヒットが発生し、context.xmlファイルが表示され、Eclipseがそれを公開しました。すべてがそれを超えて機能しました。これが誰かを助けることを願っています。

EclipseでF5キーを押す

0
theINtoy

私の場合、META-INF/context.xmlではなく[Tomcat]/Catalina/localhost/[mywebapp_name] .xmlの編集に関する問題を解決しました。

0
Joaquim Perez

この問題は、TomcatインストールディレクトリにSQL driverがないためにも発生する可能性があります。

mysql-connector-Java-5.1.23-bin.jarフォルダにApache-Tomcat-9.0.12/lib/がなければなりませんでした。

https://dev.mysql.com/downloads/connector/j/

0
Dinath

Context envContext = (Context)initContext.lookup("Java:comp/env");

not:Context envContext = (Context)initContext.lookup("Java:/comp/env");

0
Blade Master

context.xmlでのみリソースを指定しようとしましたか

<Resource name="jdbc/PollDatasource" auth="Container" type="javax.sql.DataSource"
driverClassName="org.Apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll_database;create=true"
username="suhail" password="suhail"
maxActive="20" maxIdle="10" maxWait="-1" />

<resource-ref>セクションをweb.xmlから削除しますか?

あるプロジェクトでは、<resource-ref>web.xmlセクションのない構成を見て、それが機能しました。

これは経験に基づいた推測ですが、<resource-ref>jdbc/PollDatasourceという名前のJNDIリソースのweb.xml宣言は、context.xmlの同じ名前のリソースの宣言をオーバーライドし、web.xmlの宣言にdriverClassNameurlの両方がないため、そのプロパティのNPEがないと思います。

0

組み込みドライバーを使用している場合、connectStringはただ

jdbc:derby:databaseName 

(; create = true; user = xxxなどのようなオプション)。

クライアントドライバーを使用している場合、接続文字列はそのままにしておくことができますが、ドライバーを変更しても結果が得られない場合は...質問を許しますが、Derby Network Serverを ダービーのチュートリアル

0
pafau k.