无法为连接URL'null'创建类''的JDBC驱动程序:我不明白这个异常 [英] Cannot create JDBC driver of class ' ' for connect URL 'null' : I do not understand this exception

查看:89
本文介绍了无法为连接URL'null'创建类''的JDBC驱动程序:我不明白这个异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我提供数据库网址时,为什么会说 null 网址并在异常中提供一个空的''类?

Why does it say null URL and gives a empty ' ' class in the exception when i have provided the database URL ?

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

I try to connect to derby database via a servlet while using Tomcat. When the servlet gets run,I get the following exceptions :

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

}

这有什么例外?我得到此异常的原因是什么?

What exception is this ? What is the reason i get this exception ?

我在Tomcat的 context.xml 中添加了以下标记:

I have added the following tag in context.xml of 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>

我在哪里犯了一个错误?

Where am i making a mistake ?

显示数据库网址的图片..

注意:之后@Bryan Pendleton的回答我将驱动程序更改为 org.apache.derby.jdbc.ClientDriver 但我得到了同样的例外。

NOTE : After the answer by @Bryan Pendleton I changed the driver to org.apache.derby.jdbc.ClientDriver but I get the same exception.

推荐答案

我看不出任何明显的错误,但也许不同的方法可能会帮助你调试它?

I can't see anything obviously wrong, but perhaps a different approach might help you debug it?

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

You could try specify your datasource in the per-application-context instead of the global tomcat one.

您可以通过创建一个src / main / webapp / META-INF / context.xml(我假设您正在使用标准的maven目录结构 - 如果没有,那么META-INF文件夹应该是您的WEB-INF目录的兄弟)。 META-INF / context.xml文件的内容如下所示:

You can do this by creating a src/main/webapp/META-INF/context.xml (I'm assuming you're using the standard maven directory structure - if not, then the META-INF folder should be a sibling of your WEB-INF directory). The contents of the META-INF/context.xml file would look something like:

<?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需要与您的应用程序的具体细节相匹配。

Obviously the path and docBase would need to match your application's specific details.

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

Using this approach, you don't have to specify the datasource details in Tomcat's context.xml file. Although, if you have multiple applications talking to the same database, then your approach makes more sense.

无论如何,给它一个旋转,看看它是否有任何区别。它可能会给我们一个关于你的方法出了什么问题的线索。

At any rate, give this a whirl and see if it makes any difference. It might give us a clue as to what is going wrong with your approach.

这篇关于无法为连接URL'null'创建类''的JDBC驱动程序:我不明白这个异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆