问题描述
当我提供数据库网址时,为什么会说 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驱动程序:我不明白这个异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!