Подтвердить что ты не робот

Невозможно создать JDBC-драйвер класса '' для подключения URL-адреса 'null': я не понимаю это исключение

Почему он говорит нулевой URL и дает пустой класс '' в исключении, когда я указал URL базы данных?

Я пытаюсь подключиться к базе данных derby через сервлет при использовании 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();
        }
    }
}

Что это за исключение? Почему я получаю это исключение?

Я добавил следующий тег в context.xml Tomcat:

<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, но получил то же исключение.

4b9b3361

Ответ 1

Я не вижу ничего явно неправильного, но, возможно, другой подход может помочь вам отладить его?

Вы можете попробовать указать свой источник данных в контексте для каждого приложения, а не глобальный tomcat.

Вы можете сделать это, создав src/main/webapp/META-INF/context.xml(я предполагаю, что вы используете стандартную структуру каталогов maven - если нет, тогда папка META-INF должна быть sibling вашего каталога 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. Хотя, если у вас несколько приложений, работающих с одной и той же базой данных, то ваш подход имеет больше смысла.

Во всяком случае, дайте этому вихрь и посмотрите, не имеет ли значения. Это может дать нам понять, что не так с вашим подходом.

Ответ 2

Несколько исправлений:

  • Используйте правильное имя класса драйвера для вашей среды: если вы используете сервер Derby вне процесса, то вы хотите, чтобы ClientDriver (и ему нужно было использовать derbyclient.jar), имя хоста и порт и т.д. Если вам нужен сервер Derby в процессе, то вы хотите derby.jar, EmbeddedDriver и URL-адрес, подходящий для встроенной базы данных.

  • Поместите файл JAR драйвера только в каталог Tomcat lib/.

  • Не помещайте ничего в Tomcat conf/context.xml: на самом деле нет причин для этого. Вместо этого используйте ваш webapp META-INF/context.xml, чтобы определить ваш <Resource>.

Ошибка "Cannot create JDBC driver of class '' for connect URL 'null' обычно возникает, потому что драйвер JDBC находится не в нужном месте (или в слишком многих местах, например в каталоге Tomcat lib/, но также в каталоге webapp WEB-INF/lib/). Убедитесь, что у вас есть правильный файл JAR драйвера в нужном месте.

Ответ 3

Эти две вещи не совпадают:

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

Ответ 4

Я получаю эту проблему, потому что я помещаю context.xml в неправильный путь:

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

Правильный путь:

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

Ответ 5

Если вы используете eclipse, вы должны изменить context.xml из проекта сервера, созданного в вашем обозревателе пакетов eclipse. При использовании tomcat в eclipse он является единственным допустимым, остальные игнорируются или перезаписываются

Ответ 6

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

не Context envContext = (Context)initContext.lookup("java:/comp/env");

Ответ 7

Вы пытались указать ресурс только в 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> ресурса JNDI с именем jdbc/PollDatasource в web.xml может переопределить объявление ресурса с тем же именем в context.xml, а декларация в web.xml отсутствует как driverClassName и url, следовательно, NPE для этих свойств.

Ответ 8

Если вы используете встроенный драйвер, connectString просто

jdbc:derby:databaseName 

(варианты whites: create = true, user = xxx и т.д.).

Если вы используете клиентский драйвер, строка подключения может быть оставлена ​​как есть, но если изменение драйвера не дает результата... извините вопрос, но вы на 100% уверены, что вы запустили сетевой сервер Derby в соответствии с Учебник Derby?

Ответ 9

В моем случае я решил проблему редактирования [tomcat]/Catalina/localhost/[mywebapp_name].xml вместо META-INF/context.xml.

Ответ 10

У меня была аналогичная проблема с Tomcat против Oracle. У меня есть файл context.xml в каталоге META-INF на диске. Однако этот файл не показывался в проекте eclipse. Простой щелчок на обновлении F5 и появился файл context.xml, и затмение опубликовало его. Все прошло. Надеюсь, это поможет кому-то.

Попробуйте нажать F5 в eclipse

Ответ 11

Проблема также может возникнуть из-за отсутствия SQL driver в каталоге установки Tomcat.

Мне нужно было mysql-connector-java-5.1.23-bin.jar в папке apache-tomcat-9.0.12/lib/.

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