2013-03-03 194 views
0

嘗試從servlet建立數據庫連接時遇到一些問題。JDBC驅動程序和Tomcat的問題

我有以下類處理servlet中的數據庫連接,但我不斷收到Class.forName()的NullPointerException。

DB的Util類:

public class Database { 

    private static Connection connection = null; 

    /** 
    * 
    * @return 
    */ 
    public static Connection getConnection(){ 
     if(connection!=null){ 
      return connection; 
     } else { 
      try { 
       Properties db_properties = new Properties(); 
       InputStream inStream = Database.class.getClassLoader().getResourceAsStream("/db.properties"); 
       db_properties.load(inStream); 
       //String dbDriver = db_properties.getProperty("driver").trim(); 
       String url = db_properties.getProperty("url").trim(); 
       String dbUser = db_properties.getProperty("user").trim(); 
       String dbPass = db_properties.getProperty("pass").trim(); 
       Class.forName("com.mysql.jdbc.Driver"); 
       connection = DriverManager.getConnection(url,dbUser,dbPass); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
     return connection; 
    } 
} 

具有以下屬性的文件(我想硬編碼的司機,仍然得到同樣的錯誤!):

driver=com.mysql.jdbc.Driver 
url=jdbc:mysql://localhost:8889/gymbuddy 
user=Mathan 
pass=PYCCmcPDAFSj7N9B 

我也得到了以下堆棧跟蹤:

SEVERE: Allocate exception for servlet BuddyController 
java.lang.NullPointerException 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:171) 
    at com.mathanv.gb.util.Database.getConnection(Database.java:35) 
    at com.mathanv.gb.dao.BuddyDao.<init>(BuddyDao.java:35) 
    at com.mathanv.gb.controller.BuddyController.<init>(BuddyController.java:29) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at java.lang.Class.newInstance0(Class.java:357) 
    at java.lang.Class.newInstance(Class.java:310) 
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:138) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1137) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:858) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:136) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
    at java.lang.Thread.run(Thread.java:680) 

我想從Android客戶端發送發佈請求。 HTTPpost請求似乎工作!但獲得連接給了我上面的例外!幫幫我!

以下是我的Servlet的佈局:

Servlet Layout

讓我知道如果你需要更多的信息!

回答

1

您可以得到該異常的唯一方法是將null傳遞給Class.forName(),或者可能通過損壞JVM。您顯示的代碼不能拋出該異常。仔細檢查你的結果。最壞的情況下,你應該得到一個ClassNotFoundException。也許你已經更新了你的代碼,但還沒有編譯和重新部署它,所以你看到服務器上運行的舊代碼的結果仍然存在。

+1

問題是服務器沒有更新我的更改。必須確保通過清理項目並終止服務器並重新啓動以及重新啓動android模擬器。非常感謝! – MathanMV 2013-03-05 00:31:55

+0

是的,在我的情況下,我需要做一個maven項目更新,在某些地方配置了borked – chrismarx 2015-04-17 18:44:47

-1

如果你在更多的位置有一個mysql驅動程序,會發生這種情況。

嘗試尋找其他locations.Or從lib文件夾中刪除我。如果正如我所說的那樣應該解決問題。

+0

驅動程序jar在多個地方不會給你一個NPE。你可能不會得到你認爲你得到的驅動程序版本。 – 2013-03-03 13:18:26

+0

Ok @Ryan Stewart我以爲我讀過ClassNotFoundException – Gyonder 2013-03-03 13:45:26

+0

對不起,但這不會發生多個驅動程序罐。如果駕駛員完全從班級路徑中失蹤,那將是如此。 – 2013-03-03 13:57:35

0

立即刪除您的代碼並立即在Tomcat中使用DataSource。您的代碼遠離高質量。

0

你確定當你在代碼中硬編碼驅動程序名稱時,你也會得到相同的錯誤。 當您將null作爲參數傳遞時,Class.forName()會引發空指針異常。我認爲在第一種情況下,屬性文件未加載並且驅動程序名稱返回null。