java.sql.SQLException:Io异常:在JDBC与oracle连接期间,从读取调用中获得负1

java.sql.SQLException:Io异常:在JDBC与oracle连接期间,从读取调用中获得负1,java,oracle,jdbc,Java,Oracle,Jdbc,嗨,我是java新手,当我尝试用java示例代码连接oracle时,我遇到了上述异常 我的代码是 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.Http

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

我的代码是

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)
java.sql.SQLException:Io异常:从读取调用中得到负1
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:441)
位于oracle.jdbc.driver.T4CConnection(T4CConnection.java:165)
位于oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
位于oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
位于java.sql.DriverManager.getConnection(未知源)
位于java.sql.DriverManager.getConnection(未知源)
位于com.wipro.connnection.DbConnectivity.doGet(DbConnectivity.java:16)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
位于java.lang.Thread.run(未知源)

请帮我整理一下,Oracle通常使用端口1521访问数据库,而您似乎使用的是端口8080。您应该检查以确保指定了正确的端口。

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

比如说

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

首先,连接URL是错误的。8080后通常由类似ApacheTomcat的Web服务器使用。Oracle本身使用默认端口1521。另见

而且你忘了打电话了。这将把光标设置到结果集中的下一行。返回结果集时,光标位于第一行之前。如果不移动光标,对
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中),您可能会发现这些提示和示例非常有用。例如,关闭语句和连接的方式容易导致资源泄漏。另外,在GET请求时加载JDBC驱动程序的开销也不必要。只需在应用程序启动或servlet初始化期间执行一次即可。

解决方案1:

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驱动程序。但是类型1驱动程序没有给出这个异常。 因此,目前我使用的是类型1驱动程序

tnsnames.ora检查端口号,
sid

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

解决方案2:


在您的计算机上安装vmware,安装操作系统,然后程序将与类型4驱动程序一起工作

我知道这条线有点旧,但这是我的工作原理

使用oracle db客户机(如sql developer)或其他工具检查连接,以确保连接字符串正常工作并能够使用它连接到db。 如果您使用的是Oracle db Express Edition,即XE, 无论web客户端在哪里运行,SID都是XE,端口都是1521。您还可以从web客户端设置和其他位置检查这一点

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")  

在此之后,您不会得到异常

我也尝试了1521,但在这种情况下,它拒绝与数据库连接,并且出现了ora 12505错误。调试程序时,我发现在Connection con=DriverManager.getConnection(“jdbc:oracle:thin:@localhost:8080:orcl”,“system”,“tiger”)处引发了异常;你能通过这条线吗?首先修复连接URL。Oracle当然不会监听端口8080。通常是Tomcat在8080上监听,而不是DB服务器。Oracle默认使用1521。我在另一条评论中看到,您在使用1521时得到了ORA 12505,在这种情况下,请查看ORA-code.com:这个问题已经收到接受的,3个多月前的答案被选上了,而你的迟交答案没有添加任何新内容。@ChristianKönig当我搜索此答案时,我没有得到正确的答案。你在正确的答案页面上-滚动到顶部并阅读BalusC提供的答案-它从第一个开始,连接URL错误。8080后通常由类似ApacheTomcat的Web服务器使用。Oracle本身使用默认端口1521。