2012-07-24 15 views
1

給大家的好日子,在glassfish中導入derby驅動程序的問題

我在使Glassfish 3.1.2看到一些導入的罐子時遇到一些問題。因爲這我我的畢業設計項目我有約束。我不能使用Glassfish,Netbeans以外的其他任何東西,我也不能使用Maven,Hibernate,Ear或者其他任何東西。

我正在使用嵌入式Derby驅動程序。 (我可以使用另一個數據庫,但在我的試驗中問題依然存在)。

我已經寫了一些普通的Java代碼連接到DB:

try{ 
     Connection c = DriverManager.getConnection(URL, USER, PWD); 
     Statement st = c.createStatement();     
     st.executeUpdate("CREATE TABLE Users" + 
         " (ACCOUNT VARCHAR(20) PRIMARY KEY," + 
         " PWD VARCHAR(20) NOT NULL," + 
         " USERTYPE INTEGER NOT NULL)"); 

         ... 

     } 
     catch (SQLException x){ 
     System.out.println(x); 
     } 

這是醜陋的,它不使用連接池,它的工作原理。我會稍後使用它們。 很明顯,我不得不將derbyclient.jar添加到庫。

,就會出現問題,當我嘗試使用這種方法的Servlet中:

protected void processRequest(HttpServletRequest req, HttpServletResponse res) 
     throws ServletException, IOException { 

    try{   
     DriverManager.registerDriver(org.apache.derby.jdbc.ClientDriver);    
     Connection c = DriverManager.getConnection(dbUsr, pwd, url);    
     Statement st = c.createStatement();    
     ResultSet rs = st.executeQuery(query); 

         ... 

     }catch (SQLException e){ 
     ServletException e1 = new ServletException(e.getMessage()); 
     throw e1; 
    } 

我不能編譯的servlet,因爲「包org.apache.derby.jdbc不存在」。

我可以提供一些更多的信息(20小時以上的閱讀和不成功的試驗):

  • 該servlet和Java代碼在同一個項目,所以derbyclient.jar中應當由他們兩個可以看出。
  • 當我編寫org.apache.berby時,netbeans向我展示了用於自動完成的包導航器,所以在某處它知道有一個jar。
  • 我試圖把裏面請將derbyclient.jar:
    • 的Glassfish/GlassFish中/域/域1/lib目錄
    • 的Glassfish/GlassFish中/域/域1/lib/ext目錄
    • 的Glassfish/GlassFish的/ lib目錄
  • 嘗試沒有驅動程序註冊,java代碼沒有它的工作,但我得到「javax.servlet.ServletException:找不到適合的應用程序驅動程序」。我覺得這是合理的。

我在我的智慧結束。有人關心幫助嗎?

編輯:

昨天我得到的消息從老師:她指責NetBeans IDE中輸球軌道罐子。這似乎是一個已知的錯誤。

熱烈鼓勵我切換到tomcat服務器。我一定會嘗試,我會繼續努力解決這個問題。還有其他好點子嗎?

+0

提供錯誤堆棧跟蹤 – 2012-07-24 11:11:38

回答

1

No suitable driver found」通常表示您提供給連接的JDBC URL具有不正確的語法。或者驅動程序根本沒有加載。

在連接到數據庫之前,您必須使用Class.forName加載驅動程序。 URL德比是:在德比

Class.forName("org.apache.derby.jdbc.ClientDriver"); 

更多細節請查看documentation

也檢查你在classpath有derby.jar。我建議將derby.jar放置在您的項目的物理位置/WEB-INF/lib目錄中。然後,IDE將負責其餘的部分。

+0

我會的地方,你的建議的jar(該死這聽起來奇怪:P)。 我會解僱不正確的語法,因爲我使用ide的自動完成。在其他方面效果很好。 而且這個作品與這個類別的奇怪時尚。就在我完成標籤並點擊我的選擇後,他們會以紅色突出顯示,並且出現錯誤。 – user1548241 2012-07-25 05:59:49

+0

@ user1548241:請查看已編輯的答案 – 2012-07-25 08:47:42

0

您應該(一般情況下)不要使用DriverManager自己註冊驅動程序這是驅動程序實現的責任。對於JDBC 3.0和earliers(Java 5中之前),你需要加載類讓它註冊自己:

Class.forName("org.apache.derby.jdbc.ClientDriver") 

當類被加載,驅動程序本身向DriverManager註冊。

對於兼容JDBC 4.0的驅動程序(Java 6和7),甚至不需要這樣做,因爲JDBC 4.x使用ServiceLoader機制,並且每個兼容的驅動程序將在它的jar中的META-INF/services/java.sql.Driver文件中列出其驅動程序實現,文件。

因此,一般而言,您應該自己調用'DriverManager.registerDriver(..)',並且不應該使用而是使用。如果由於某種原因,您確實需要在代碼中註冊驅動程序(例如,因爲驅動程序實際上不會自動向DriverManager註冊自己),那麼請確保實際的驅動程序也位於編譯路徑(構建路徑)中,並且不只是在應用程序服務器的lib文件夾中(這似乎是您的實際問題)。

還記得你需要註冊一個驅動程序的實例,而不是一個類。所以,你需要初始化它:

DriverManager.registerDriver(new org.apache.derby.jdbc.ClientDriver()); 
+0

非常感謝您的解釋。我沒有提到,我使用司機的遺產。我會嘗試使用Class.forName,也許這就是問題所在。 – user1548241 2012-07-25 05:59:14