2010-03-02 34 views
6

嗨JDBC連接在讀取調用我是新來的Java,當我試圖給Oracle,我的Java代碼示例連接,我得到了上面的異常值java.sql.SQLException:IO異常:GOT減去一個從甲骨文

我的代碼是

import java.sql.*; 
import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class DbConnectivity extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
     try { 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:8080:orcl", "system", "tiger");\\ The Exception thrown here 
     Statement stmt = con.createStatement(); 
     ResultSet rst = stmt.executeQuery("select * from users"); 
     System.out.println(rst.getString(1)); 
     stmt.close(); 
     con.close(); 
    } catch (ClassNotFoundException e) 
    { 
     e.printStackTrace(); 
    } catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 
    } 

} 

和拋出的異常是

java.sql.SQLException: Io exception: Got minus one from a read call 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255) 
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387) 
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:441) 
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165) 
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35) 
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801) 
at java.sql.DriverManager.getConnection(Unknown Source) 
at java.sql.DriverManager.getConnection(Unknown Source) 
at com.wipro.connnection.DbConnectivity.doGet(DbConnectivity.java:16) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Unknown Source) 

幫助我弄清楚這個

回答

10

首先,連接URL是錯誤的。 Post 8080通常由Apache Tomcat等網絡服務器使用。 Oracle本身使用默認端口1521.另請參閱this Oracle JDBC documentation

此外,您忘記了撥打ResultSet#next()。這會將遊標設置爲結果集中的下一行。結果集與第一行之前的光標一起返回。如果您不移動光標,則任何getXXX()調用ResultSet將失敗。

如果您在結果集中指望多行,那麼你需要使用while循環:

resultSet = statement.executeQuery(); 
while (resultSet.next()) { 
    String columnname = resultSet.getString("columnname"); 
    // ... 
} 

或者,如果您希望只有一行,那麼你也可以用if聲明繼續:

resultSet = statement.executeQuery(); 
if (resultSet.next()) { 
    String columnname = resultSet.getString("columnname"); 
    // ... 
} 

更多的提示和使用基本 JDBC的正確方法的實例(也JSP/Servlet),你可能會發現this article有用。例如,您關閉語句和連接的方式容易發生資源泄漏。在GET請求上加載JDBC驅動程序也是非常昂貴的。只需在應用程序啓動或servlet初始化期間執行一次即可。

+0

當我調試程序時,我發現拋出的異常在 Connection con = DriverManager.getConnection(「jdbc:oracle: thin:@localhost:8080:orcl「,」system「,」tiger「); 您能否請通過這一行 – karki

+0

首先修復連接URL。 Oracle當然不會在端口8080上偵聽。通常是Tomcat在8080上偵聽,而這不是數據庫服務器。 Oracle默認使用1521. – BalusC

+0

我在另一個評論中看到你使用1521時得到了一個ORA 12505,在這種情況下只需檢查ora-code.com:http://ora-12505.ora-code.com/ – BalusC

1

通常,Oracle使用端口1521進行數據庫訪問,而您似乎正在使用端口8080。你應該檢查以確保你已經指定了正確的端口。

+0

我也試過1521,但在這種情況下,它拒絕連接數據庫和ora 12505錯誤發生 – karki

1

我看到的一個錯誤是你需要做一個rs.next(); 這將得到他第一個結果集。

例如

while (!rs.next()){ 
    //read rs.getString(1); 
} 
0
package testing; 

import java.sql.DriverManager; 
import java.sql.Connection; 

import java.sql.SQLException; 
import java.sql.*; 

public class OracleJDBC { 

    public static void main(String[] argv) { 

     System.out.println("-------- Oracle JDBC Connection Testing ------"); 

     try { 

      Class.forName("oracle.jdbc.driver.OracleDriver"); 

     } catch (ClassNotFoundException e) { 

      System.out.println("Where is your Oracle JDBC Driver?"); 
      e.printStackTrace(); 
      return; 

     } 

     System.out.println("Oracle driver registered"); 
     Connection conn=null; 

     try { 

      conn = DriverManager.getConnection(
        "jdbc:oracle:thin:@localhost:1521:orclh", "scott", 
        "tiger"); 

      Statement stmt= conn.createStatement(); 
      ResultSet r=stmt.executeQuery("Select * from emp"); 
      while(r.next()){ 
      String str= r.getString("ename"); 
      System.out.println (str); 
      } 

     } catch (SQLException e) { 

      System.out.println("Connection Failed! Check output console"); 
      e.printStackTrace(); 
      return; 

     } 
    } 
} 
0

解決方案1:

我認爲這個例外是由於操作系統的內部環境問題。

我得到了與類型4驅動程序相同的問題。但是類型1驅動程序沒有給出此例外。 因此,目前我正在使用類型1驅動程序。

檢查端口號,sidtnsnames.ora

C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN\SAMPLE\tnsnames.ora

解決方案2:

您的計算機上安裝vmware,安裝操作系統,然後程序會與型4司機工作。

0

我知道這個線程有點舊,但這裏是對我有用的。

檢查連接使用oracle數據庫客戶端,如SQL開發人員或其他東西,以確保連接字符串工作,並能夠連接到數據庫與它。 如果您使用的是Oracle數據庫Express Edition,它是XE, SID是XE,端口是1521,無論Web客戶端在哪裏運行。您也可以從網絡客戶端設置和其他地方查看。

-1
This is occur due to wrong connectivity with database connection. 
In your program you write 
Connection con = DriverManager.getConnection 
        ("jdbc:oracle:thin:@localhost:8080:orcl", "system","tiger"); 

Go to D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora 

這裏你可以找到這樣的文件:

**abcd** = 
    (DESCRIPTION = 
     (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = **1521**)) 
      (CONNECT_DATA = 
      (SERVER = DEDICATED) 
      (SERVICE_NAME = abcd) 
     ) 
    ) 

現在你寫你的連接如下:

("jdbc:oracle:thin:@localhost:1521:abcd","your_db_name","your_password") 

在這之後你沒有得到例外。

+0

這個問題已在3個月前收到已接受的,已提交的答案,而您遲到的答案不會添加任何新內容。 –

+0

@ChristianKönig當我搜索這個我沒有得到適當的答案。 –

+0

你在寫答案的確切頁面上 - 滾動到頂部並閱讀由BalusC提供的答案 - 它以*開頭*首先,連接URL是錯誤的。 Post 8080通常由Apache Tomcat等網絡服務器使用。 Oracle本身使用默認端口1521 *。 –