it-swarm.com.de

Der JDBC-Treiber der Klasse '' kann für die Verbindungs-URL 'null' nicht erstellt werden: Ich verstehe diese Ausnahme nicht

Warum wird null URL angezeigt und in der Ausnahme eine leere Klasse angegeben, wenn ich die Datenbank-URL angegeben habe?

Ich versuche, über ein Servlet eine Verbindung zur derby-Datenbank herzustellen, während ich Tomcat verwende. Wenn das Servlet ausgeführt wird, bekomme ich die folgenden Ausnahmen:

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

Servlet:

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();
    }
}

}

Welche Ausnahme ist das? Was ist der Grund, warum ich diese Ausnahme bekomme?

Ich habe den folgenden Tag in context.xml von Tomcat hinzugefügt:

<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" />

und dies in 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>

Wo mache ich einen Fehler?

Bild, das die Datenbank-URL anzeigt.

enter image description here

HINWEIS: Nach der Antwort von @Bryan Pendleton habe ich den Treiber in org.Apache.derby.jdbc.ClientDriver geändert, erhalte jedoch die gleiche Ausnahme.

41
Suhail Gupta

Ich kann nichts offensichtlich falsch sehen, aber vielleicht hilft Ihnen ein anderer Ansatz, das Problem zu beheben.

Sie können versuchen, Ihre Datenquelle im Pro-Anwendungs-Kontext anstelle des globalen Tomcat-Kontexts anzugeben.

Sie können dies tun, indem Sie eine src/main/webapp/META-INF/context.xml-Datei erstellen (ich gehe davon aus, dass Sie die Standard-Verzeichnisstruktur von Maven verwenden. Wenn dies nicht der Fall ist, sollte der META-INF-Ordner ein Geschwister sein WEB-INF-Verzeichnis). Der Inhalt der Datei META-INF/context.xml würde ungefähr so ​​aussehen:

<?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>

Offensichtlich müssten der Pfad und die docBase mit den Details Ihrer Anwendung übereinstimmen.

Bei diesem Ansatz müssen Sie die Datenquellendetails nicht in der Tomcat-Datei context.xml angeben. Wenn Sie jedoch mehrere Anwendungen mit derselben Datenbank kommunizieren, ist Ihr Ansatz sinnvoller.

In jedem Fall sollte dies eine Wendung sein und sehen, ob es einen Unterschied macht. Dies könnte uns einen Hinweis darauf geben, was bei Ihrem Ansatz falsch läuft.

28
Taskmaster

Mehrere Korrekturen:

  1. Verwenden Sie den richtigen Treiberklassennamen für Ihre Umgebung: Wenn Sie einen Out-of-Process-Derby-Server verwenden, möchten Sie ClientDriver (und derbyclient.jar verwenden), den Hostnamen und den Port usw. Wenn Sie einen Derby-Server verarbeiten, dann möchten Sie derby.jar, EmbeddedDriver und eine URL, die für eine eingebettete Datenbank geeignet ist.

  2. Legen Sie Ihre Treiber-JAR-Datei nur im Tomcat-Verzeichnis lib/ ab.

  3. Setzen Sie nichts in Tomcat's conf/context.xml: Es gibt wirklich keinen Grund dafür. Verwenden Sie stattdessen META-INF/context.xml Ihrer Webapp, um Ihr <Resource> zu definieren.

Der Fehler "Cannot create JDBC driver of class '' for connect URL 'null' tritt normalerweise auf, weil sich der JDBC-Treiber nicht an der richtigen Stelle befindet (oder an zu vielen Stellen, beispielsweise im Tomcat-Verzeichnis lib/, aber auch im Verzeichnis WEB-INF/lib/ von webapp). Stellen Sie sicher, dass Sie die richtige JAR-Treiberdatei an der richtigen Stelle haben.

7

Diese zwei Dinge passen nicht zusammen:

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

Wenn Sie den EmbeddedDriver verwenden, sollte Ihre URL keine Netzwerksyntax enthalten.

Wenn Sie dagegen die Netzwerksyntax verwenden, müssen Sie den ClientDriver verwenden.

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

5
Bryan Pendleton

Ich habe dieses Problem erhalten, weil ich context.xml in den falschen Pfad geschrieben habe:

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

Der richtige Pfad war:

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

Wenn Sie Eclipse verwenden, sollten Sie die Datei context.xml aus dem Serverprojekt ändern, das in Ihrem Eclipse-Paket-Explorer erstellt wurde. Bei der Verwendung von Tomcat in Eclipse ist dies die einzige, die anderen werden ignoriert oder überschrieben

2
jesantana

Ich hatte ein ähnliches Problem mit Tomcat gegen Oracle. Ich HATTE die Datei context.xml im Verzeichnis META-INF auf der Disc. Diese Datei wurde jedoch nicht im Eclipse-Projekt angezeigt. Ein einfacher Treffer bei der Aktualisierung von F5 und der Datei context.xml wurde angezeigt, und Eclipse veröffentlichte sie. Alles hat daran gearbeitet. Hoffe das hilft jemandem.

Versuchen Sie, F5 in Eclipse zu schlagen

0
theINtoy

In meinem Fall habe ich das Problem gelöst, das [Tomcat]/Catalina/localhost/[meinwebapp_name] .xml bearbeitet wurde, anstatt META-INF/context.xml.

0
Joaquim Perez

Das Problem kann auch aufgrund eines Mangels an SQL driver in Ihrem Tomcat-Installationsverzeichnis auftreten.

Ich musste mysql-connector-Java-5.1.23-bin.jar im Apache-Tomcat-9.0.12/lib/-Ordner haben.

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

0
Dinath

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

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

0
Blade Master

Haben Sie versucht, die Ressource nur in context.xml.__ anzugeben.

<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" />

und <resource-ref> Abschnitt von web.xml entfernen?

In einem Projekt habe ich Konfiguration ohne <resource-ref> in web.xml gesehen und es hat funktioniert.

Es ist eine fundierte Vermutung, aber ich denke, die <resource-ref>-Deklaration von JNDI resource mit dem Namen jdbc/PollDatasource in web.xml kann die Ressourcendeklaration mit demselben Namen in context.xml überschreiben, und der Deklaration in web.xml fehlen sowohl driverClassName als auch url, daher die NPEs für diese Eigenschaften.

0
Yura

Wenn Sie einen eingebetteten Treiber verwenden, ist der connectString gerecht

jdbc:derby:databaseName 

(mit Optionen wie; create = true; user = xxx etc).

Wenn Sie einen Client-Treiber verwenden, kann die Verbindungszeichenfolge unverändert bleiben, aber wenn das Ändern des Treibers kein Ergebnis liefert ... entschuldigen Sie die Frage, aber sind Sie zu 100% sicher, dass Sie den Derby-Netzwerkserver gemäß das Derby Tutorial ?

0
pafau k.