2012-07-17 24 views
37

爲什麼它說 URL並給出了一個空「的例外」上課的時候我所提供的數據庫URL ?不能「的連接網址」空創建類的「JDBC驅動程序」:我不明白這個異常

我嘗試通過servlet連接到derby數據庫,同時使用Tomcat。當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(); 
    } 
} 

}

什麼例外,這是什麼?我得到這個異常的原因是什麼?在web.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" /> 

這:

我已經添加了以下標籤中的Tomcat context.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 ...

enter image description here

注:由@Bryan彭德爾頓的答案後,我改變了司機org.apache.derby.jdbc.ClientDriver,但我得到了同樣的異常。

+2

我覺得連接網址丟失。 – 2012-07-17 06:01:45

+0

@SuhailGupta我們在問題上得到標誌,表明它是重複的。有時我們會錯誤地處理它們。它發生了。我們在我們可以解決的地方修復它,並在此修復它。沒有理由再對此問題發表評論。 – casperOne 2012-07-17 15:57:18

+0

您的JDBC驅動程序.jar文件位於何處? – 2012-07-22 13:49:47

回答

25

我看不出任何明顯的錯誤,但也許不同的方法可能會幫助您調試它?

您可以嘗試在每個應用程序上下文中指定您的數據源,而不是全局的tomcat。你可以通過創建一個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> 

顯然,路徑的docBase需要滿足您的應用程序的具體細節。

使用這種方法,您不必在Tomcat的context.xml文件中指定數據源詳細信息。儘管如果你有多個應用程序與同一個數據庫交談,那麼你的方法更有意義。

無論如何,給這個旋轉,看看它是否有任何區別。這可能會讓我們知道你的方法出了什麼問題。

+0

它有所作爲!現在我想知道當我在'Tomcat's' context.xml中添加'Resource'時出了什麼問題? – 2012-07-21 04:36:32

+0

我需要更多關於你的tomcat的context.xml的信息。你在哪裏定義資源? – Taskmaster 2012-07-22 04:00:20

+3

刪除'path','docBase'和'debug':這些屬性在這種情況下是不合法的。 – 2012-07-22 21:15:49

0

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

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

+0

這是一個錯誤!編輯後得到相同的異常。看編輯 – 2012-07-17 06:16:09

+0

看到你的tomcat的context.xml:url =「connection.url」,需要編輯url,如果你不知道改成什麼,可以看看這個:http://db.apache.org/derby /docs/10.7/devguide/rdevdvlp22102.html#rdevdvlp22102 – 2012-07-17 06:41:46

+0

我更改爲'url =「jdbc:derby:poll database」',但得到相同的例外 – 2012-07-17 06:51:34

5

這兩件事情不匹配:

driverClassName = 「org.apache.derby.jdbc.EmbeddedDriver」 URL =「的jdbc:德比:// localhost:1527/poll database; create = true「

如果您使用EmbeddedDriver,則您的URL不應包含網絡語法。

相反,如果您使用網絡語法,則需要使用ClientDriver。

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

+0

_「如果您使用EmbeddedDriver,則您的URL不應包含網絡語法。」_請使用_EmbeddedDriver_ – 2012-07-18 03:46:04

+0

來說明我應該編寫URL的方式根據以下教程:http://db.apache.org /derby/papers/DerbyTut/embedded_intro.html,如果是** EmbeddedDriver,則URL應該看起來像'jdbc:derby:poll_database; create = true' ** – Yura 2012-07-21 17:44:34

0

你嘗試只在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>部分?

在一個項目中,我看到配置沒有<resource-ref>部分在web.xml,它的工作。

這是一個受過教育的猜測,但我認爲<resource-ref>聲明JNDI資源的命名web.xmljdbc/PollDatasource可以覆蓋context.xml具有相同名稱的資源的聲明,並在web.xml聲明缺少既driverClassNameurl因此對於性能的NPE。

+1

我試過但給出了'javax.naming.NameNotFoundException' – 2012-07-20 17:50:47

+0

'Tomcat'版本沒有提到 - 你能指定使用哪個版本的Tomcat嗎? – Yura 2012-07-21 17:18:15

0

如果您使用的是嵌入式驅動程序,connectString中只是

jdbc:derby:databaseName 

(蒙山類似的選項;創建= TRUE;用戶= XXX等)。

如果您使用的是客戶端驅動程序,連接字符串可以保持原樣,但如果更改驅動程序不會導致結果...請原諒問題,但您是否確實已將Derby Network Server啓動爲每the Derby Tutorial

6

了一些修復:

  1. 使用正確的驅動程序類的名稱爲您的環境:如果您正在使用的進程外的德比服務器,那麼你要ClientDriver(並需要使用derbyclient.jar中) ,主機名和端口等。如果您需要一個進程內Derby服務器,那麼您需要derby.jar,EmbeddedDriver和一個適用於嵌入式數據庫的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文件。

+0

驅動程序一直在正確的位置,即在tomcat的_lib_文件夾內。 – 2012-07-23 05:10:53

+2

@ChristopherSchultz資源投入conf/context而不是META-INF的原因是平臺無關性。您只有一個戰爭和更多的資源配置和池由給定的服務器管理。 – banterCZ 2013-01-11 12:16:13

+0

@banterCZ您可以在不修改Tomcat的站點範圍的'conf/context.xml'的情況下保持平臺獨立性。修改該文件最多隻是草率,最糟糕的是安全漏洞。 – 2014-03-10 13:37:48

1

在我的情況下,我解決了編輯[tomcat]/Catalina/localhost/[mywebapp_name] .xml而不是META-INF/context.xml的問題。

2

如果您使用的是eclipse,則應該從eclipse package explorer中創建的服務器項目中修改context.xml。在eclipse中使用tomcat時,它是唯一有效的,其他人被忽略或覆蓋

0

我對使用Tomcat的Oracle有類似的問題。 I DID在光盤上的META-INF目錄中具有context.xml。儘管這個文件並沒有在eclipse項目中顯示出來。 F5刷新和context.xml文件出現了一個簡單的命中,並且eclipse發佈了它。一切都過去了。希望這可以幫助某人。在Eclipse

嘗試按F5

2

因爲我把context.xml到錯誤的道路我得到這個問題:

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

正確的路徑是:

./src/main/webapp/META-INF/context.xml 
相關問題