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

Posted

技术标签:

【中文标题】java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一【英文标题】:java.sql.SQLException: Io exception: Got minus one from a read call during JDBC connection with oracle 【发布时间】:2010-03-02 14:16:45 【问题描述】:

您好,我是 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)

帮我解决这个问题

【问题讨论】:

【参考方案1】:

首先,连接 URL 错误。 Post 8080 通常由像 Apache Tomcat 这样的网络服务器使用。 Oracle 本身使用默认端口 1521。另请参阅this Oracle JDBC documentation。

另外你忘了打电话给ResultSet#next()。这会将光标设置到结果集中的下一行。结果集在第一行之前返回。如果您不移动光标,对ResultSet 的任何getXXX() 调用都将失败。

如果您希望结果集中有多行,那么您需要使用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 初始化期间执行一次。

【讨论】:

调试程序时发现 Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:8080:orcl", "system", "tiger") 抛出的异常;你能通过这条线吗 先修复连接URL。 Oracle 肯定不会监听 8080 端口。通常是 Tomcat 监听 8080,而不是数据库服务器。 Oracle 默认使用 1521。 我在另一条评论中看到您在使用 1521 时得到了 ORA 12505,在这种情况下,只需检查 ora-code.com:ora-12505.ora-code.com【参考方案2】:

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

【讨论】:

我也尝试使用 1521,但在这种情况下它拒绝连接数据库并出现 ora 12505 错误【参考方案3】:

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

例如

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

【讨论】:

【参考方案4】:
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;

        
    

【讨论】:

【参考方案5】:

解决方案 1:

我认为这个异常是由于操作系统内部环境问题。

type 4 驱动程序也有同样的问题。但是 type 1 驱动程序没有给出这个异常。 所以目前我正在使用 type 1 驱动程序。

检查端口号,sidtnsnames.ora

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

解决方案 2:

在您的计算机上安装 vmware,安装操作系统,然后程序将使用 type 4 驱动程序。

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:
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")  

在此之后你不会得到异常。

【讨论】:

这个问题已经在 3 个多月前收到了一个接受的、赞成的答案,而您迟到的答案并没有增加任何新内容。 @ChristianKönig 当我搜索这个时,我没有得到合适的答案。 您在写答案的确切页面上 - 滚动到顶部并阅读 BalusC 提供的答案 - 它以 开头首先,连接 URL 错误。 Post 8080 通常由像 Apache Tomcat 这样的网络服务器使用。 Oracle 本身使用默认端口 1521

以上是关于java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:Io 异常:指定了未知主机

java.sql.SQLException: Io 异常: Socket closed

java.sql.SQLException: Io 异常: Broken pipe 如何在不重启的情况下恢复?

java.sql.SQLException: Io 异常: Socket read timed out

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

java.sql.SQLException: Io 异常: Got minus one from a read call