当前位置: 首页 > 面试题库 >

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

傅博容
2023-03-14
问题内容

嗨,当我尝试用我的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)

帮我解决一下


问题答案:

首先,连接URL错误。8080后通常由Web服务器(如Apache Tomcat)使用。Oracle本身使用默认端口1521。另请参见此Oracle
JDBC文档

再者,你忘了打电话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中),您可能会发现本文很有用。例如,关闭语句和连接的方式容易发生资源泄漏。在GET请求上加载JDBC驱动程序也不必要地昂贵。在应用程序启动或servlet初始化期间只需执行一次。



 类似资料:
  • 问题内容: 我正在Amazon RDS实例上运行Oracle 11GR2。偶尔打给我时,我会收到提示,但我不确定为什么。其他应用程序可以正常工作。 为了进一步混淆,错误有时会自动纠正(在程序的下一次迭代之后)。 我应该如何处理“从读取调用中减去一个”错误? 全栈跟踪: Database.java第44行: 其他资讯: 我以为这是一个错误的JDBC URL,但它确实可以正常工作,有时要连续几天才能失

  • 是否有方法从oracle数据库获取只读JDBC连接。通常,我需要一个jdbc url参数来启用它,比如: 我正在使用薄驱动程序

  • 我一直致力于将一个项目从BC4J迁移到JPA HiberNate。首先,我们迁移了一个范围有限的实体,并且发生了意想不到的行为。 当使用本机查询查询实体时,hibernate首先检查ehcache以查看查询是否存在,因为它不存在,它会执行查询。 之后,似乎 hiberate 将转到查询返回的每个实体的数据库以填充它。 最糟糕的是,似乎每次打开和释放JDBC连接时。以下日志被重复接收了几次。 知道是

  • 这是类的构造函数之一。新对象在数据库中创建新记录。当我在源代码中“手工”创建这个对象时,一切都很好。但是当我将创建声明放入按钮的actionlistener中时,编译器返回sql异常。 我得到的例外是

  • 我正在运行一个带有Hibernate和Spring数据的Spring启动应用程序。我有以下方法: 当我第四次运行此方法时,我得到了无法获取 JDBC 连接异常。我怀疑当我调用存储过程“callEncrypt”时,Hibernate在作业完成后不会释放连接,因为如果我删除该行,应用程序就可以完美运行,无法手动关闭连接,因为Hibernate正在处理事务(并且没有理由这样做),所以我已经卡住了一段时间