无法创build用于连接URL的类''的JDBC驱动程序'null':我不明白这个例外

为什么它会提示 URL,并在提供数据库URL时在exception中提供一个空的“”类?

我尝试使用Tomcat通过servlet连接到derby数据库。 当servlet运行时,我得到以下例外:

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

}

这是什么例外? 我得到这个exception的原因是什么?

我在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> 

我在哪里犯错误?

显示数据库URL的图像

在这里输入图像说明

注:@Bryan彭德尔顿的答案后,我把驱动程序更改为org.apache.derby.jdbc.ClientDriver但我得到相同的例外。

我看不出有什么明显的错误,但也许有不同的方法可以帮助您debugging它?

您可以尝试在每个应用程序上下文中指定您的数据源,而不是全局Tomcat。

你可以通过创build一个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> 

path和docBase显然需要匹配你的应用程序的具体细节。

使用这种方法,您不必在Tomcat的context.xml文件中指定数据源详细信息。 虽然如果你有多个应用程序在同一个数据库中交谈,那么你的方法更有意义。

无论如何,给这个旋转,看看是否有任何区别。 这可能会让我们知道你的方法出了什么问题。

这两件事不符:

driverClassName =“org.apache.derby.jdbc.EmbeddedDriver”url =“jdbc:derby:// localhost:1527 / poll database; create = true”

如果您使用EmbeddedDriver,则您的URL不应包含networking语法。

相反,如果您使用networking语法,则需要使用ClientDriver。

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

几个修正:

  1. 为您的环境使用正确的驱动程序类名称:如果您使用的是进程外Derby服务器,那么您需要ClientDriver(并需要使用derbyclient.jar),主机名和端口等。如果要使用“处理Derby服务器,那么你需要derby.jar,EmbeddedDriver和一个适合embedded式数据库的URL。

  2. 把你的驱动JAR文件只放在Tomcat的lib/目录下。

  3. 不要把任何东西放在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文件。

如果你使用的是eclipse,你应该从你的eclipse package explorer中创build的服务器项目中修改context.xml。 在eclipse中使用tomcat时是唯一有效的,其他的则被忽略或覆盖

我得到这个问题,因为我把context.xml放到错误的path:

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

正确的道路是:

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

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

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

您是否尝试仅在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>部分?

在一个项目中,我已经看到在web.xml没有<resource-ref>部分的configuration,它工作。

这是一个受过教育的猜测,但我认为web.xml名为jdbc/PollDatasourceJNDI资源的声明可能会覆盖context.xml具有相同名称的资源的声明,并且web.xml的声明缺lessdriverClassNameurl因此该属性的NPE。

如果您使用的是embedded式驱动程序,那么connectString就是

 jdbc:derby:databaseName 

(whith选项像;创build= true;用户= xxx等)。

如果您使用的是客户端驱动程序,连接string可以保持原样,但如果更改驱动程序没有结果…请原谅这个问题,但是您是否100%确定您已经按照Derby教程启动了Derby Network Server ?

在我的情况下,我解决了编辑[tomcat] / Catalina / localhost / [mywebapp_name] .xml而不是META-INF / context.xml的问题。

我有一个类似的问题使用Tomcat对甲骨文。 我在光盘上的META-INF目录中有context.xml。 这个文件并没有在eclipse项目中显示。 在F5刷新和context.xml文件出现一个简单的命中出现和eclipse发布它。 一切都过去了。 希望这有助于某人。

尝试在日食中打F5

Interesting Posts