java.sql.SQLException:Io异常:在与oracle的JDBC连接期间从读取调用中减去了一个

时间:2010-03-02 14:16:45

标签: java oracle jdbc

嗨,当我尝试使用我的java示例代码连接oracle时,我是java新手我得到了上述异常

我的代码是

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)

帮我解决这个问题

7 个答案:

答案 0 :(得分:10)

首先,连接URL错误。 Post 8080通常由Apache Tomcat等Web服务器使用。 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");
    // ...
}

有关正确使用 basic JDBC的更多提示和示例(也在JSP / Servlet中),您可能会发现this article非常有用。例如,关闭语句和连接的方式容易导致资源泄漏。在GET请求上加载JDBC驱动程序也是非常昂贵的。只需在应用程序启动或servlet初始化期间执行一次。

答案 1 :(得分:1)

通常,Oracle使用端口1521进行数据库访问,而您似乎正在使用端口8080。您应该检查以确保指定了正确的端口。

答案 2 :(得分:1)

我看到的一个错误是你需要做一个rs.next(); 这将得到他的第一个结果集。

例如

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

答案 3 :(得分: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;

        }
    }
}

答案 4 :(得分:0)

解决方案1:

我认为这个例外是由于操作系统内部环境问题造成的。

我的 type 4 驱动程序遇到了同样的问题。但类型1 驱动程序没有给出此异常。 所以目前我正在使用 类型1 驱动程序。

检查sid

处的端口号tnsnames.ora

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

解决方案2:

在您的计算机上

安装vmware ,安装操作系统,然后程序将与 type 4 驱动程序一起使用。

答案 5 :(得分:0)

我知道这个帖子有点旧,但这对我有用。

使用oracle数据库客户端(如sql developer或其他方法)检查​​连接,以确保连接字符串正常工作并能够使用它连接到数据库。 如果您使用的是XE的Oracle db Express Edition, 无论Web客户端运行在何处,SID都是XE,端口是1521。您也可以从Web客户端设置和其他位置进行检查。

答案 6 :(得分:-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")  

在此之后你不会得到例外。