java - forname - No se puede crear el controlador JDBC de la clase '''' para conectar la URL ''nulo'': no entiendo esta excepción
jdbc driver (10)
¿Por qué dice nulo URL y da una clase vacía en la excepción cuando he proporcionado la URL de la base de datos?
Intento conectarme a la base de datos de derby
mediante un servlet mientras uso Tomcat
. Cuando se ejecuta el servlet, obtengo las siguientes excepciones:
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();
}
}
}
¿Qué excepción es esto? ¿Cuál es la razón por la que recibo esta excepción?
He agregado la siguiente etiqueta en context.xml
de 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" />
y esto en 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>
¿Dónde estoy cometiendo un error?
Imagen que muestra la URL de la base de datos ..
NOTA: Después de la respuesta de @Bryan Pendleton, cambié el controlador a org.apache.derby.jdbc.ClientDriver
pero recibo la misma excepción.
¿Intentó especificar el recurso solo en 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" />
y eliminar la sección <resource-ref>
de web.xml
?
En un proyecto, he visto la configuración sin la sección <resource-ref>
en web.xml
y funcionó.
Es una suposición educada, pero creo que la declaración de <resource-ref>
del recurso JNDI
llamado jdbc/PollDatasource
en web.xml
puede anular la declaración de recurso con el mismo nombre en context.xml
y la declaración en web.xml
falta tanto de la driverClassName
como de la url
de ahí los NPE para esas propiedades.
En mi caso, resolví el problema de edición [tomcat] / Catalina / localhost / [mywebapp_name] .xml en lugar de META-INF / context.xml.
Estaba obteniendo este problema porque puse context.xml
en la ruta incorrecta:
./src/main/resources/META-INF/context.xml
El camino correcto fue:
./src/main/webapp/META-INF/context.xml
Estas dos cosas no coinciden:
driverClassName = "org.apache.derby.jdbc.EmbeddedDriver" url = "jdbc: derby: // localhost: 1527 / base de datos de sondeo; create = true"
Si está utilizando EmbeddedDriver, su URL no debe contener sintaxis de red.
Por el contrario, si está utilizando la sintaxis de red, debe usar ClientDriver.
http://db.apache.org/derby/docs/10.8/getstart/rgsquck35368.html
No puedo ver nada obviamente mal, pero tal vez un enfoque diferente podría ayudarte a depurarlo?
Podría intentar especificar su fuente de datos en el contexto por aplicación en lugar del global tomcat.
Puede hacer esto creando src / main / webapp / META-INF / context.xml (supongo que está utilizando la estructura de directorios maven estándar; si no, la carpeta META-INF debe ser un hermano de su Directorio WEB-INF). El contenido del archivo META-INF / context.xml sería similar a:
<?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>
Obviamente, la ruta y el docBase necesitarían coincidir con los detalles específicos de su aplicación.
Al usar este enfoque, no tiene que especificar los detalles de la fuente de datos en el archivo context.xml de Tomcat. Aunque, si tiene varias aplicaciones que hablan en la misma base de datos, entonces su enfoque tiene más sentido.
En cualquier caso, dale un giro y ve si hace alguna diferencia. Podría darnos una pista sobre qué está yendo mal con su enfoque.
Si está utilizando eclipse, debe modificar context.xml, desde el proyecto del servidor creado en su explorador de paquetes de eclipse. Cuando se usa tomcat en eclipse, es el único válido, los demás se ignoran o sobrescriben
Si está utilizando un controlador incrustado, connectString es solo
jdbc:derby:databaseName
(con opciones como; create = true; user = xxx, etc.).
Si está utilizando un controlador de cliente, la cadena de conexión se puede dejar como está, pero si cambiar el controlador no da ningún resultado ... disculpe la pregunta, pero ¿está 100% seguro de haber iniciado el servidor de red Derby según el tutorial de Derby? ?
Tuve un problema similar al usar Tomcat contra Oracle. TENGO el contexto.xml en el directorio META-INF, en el disco. Sin embargo, este archivo no se mostraba en el proyecto Eclipse. Un simple golpe en la actualización de F5 y apareció el archivo context.xml y eclipse lo publicó. Todo funcionó más allá de eso. Espero que esto ayude a alguien.
Intenta golpear F5 en eclipse
Varias correcciones:
Utilice el nombre correcto de la clase de controlador para su entorno: si está utilizando un servidor Derby fuera de proceso, entonces quiere ClientDriver (y necesita usar derbyclient.jar), el nombre de host y el puerto, etc. Si desea un procesa el servidor de Derby, luego quieres derby.jar, EmbeddedDriver y una URL apropiada para una base de datos incrustada.
Coloque su archivo JAR de controlador solo en el directorio
lib/
Tomcat.No coloque nada en
conf/context.xml
Tomcat: no hay realmente ninguna razón para ello. En su lugar, useMETA-INF/context.xml
de suMETA-INF/context.xml
para definir su<Resource>
.
El error "Cannot create JDBC driver of class '''' for connect URL ''null''
generalmente ocurre porque el controlador JDBC no está en el lugar correcto (o en demasiados lugares, como el lib/
directorio de Tomcat, sino también en WEB-INF/lib/
directorio WEB-INF/lib/
). Verifique que tenga el archivo JAR del controlador correcto en el lugar correcto.
Context envContext = (Context)initContext.lookup("java:comp/env");
no: Context envContext = (Context)initContext.lookup("java:/comp/env");