Ява.язык SQL.SQLException: исключение ввода-вывода: получил минус один из вызова чтения во время соединения JDBC с oracle

Привет я новичок в 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 ответов


во-первых, URL-адрес соединения неверен. Сообщение 8080 обычно используется веб-сервером, таким как 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");
    // ...
}

дополнительные советы и примеры, используя basic JDBC правильный путь (также в JSP/Servlet) вы можете найти в этой статье полезное. Например, способ закрытия оператора и соединения подвержен утечке ресурсов. Также загрузка драйвера JDBC по запросу GET является излишне дорогостоящей. Просто сделайте это один раз во время запуска приложения или инициализации сервлета.


обычно Oracle использует порт 1521 для доступа к базе данных, а вместо него используется порт 8080. Вы должны проверить, чтобы убедиться, что вы указали правильный порт.


одна ошибка, которую я вижу, заключается в том, что вам нужно сделать rs.следующий(); Это будет первый результат.

while (!rs.next()){
  //read rs.getString(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;

        }
    }
}

Решение 1 :

Я думаю, что это исключение связано с проблемой внутренней среды операционной системы.

у меня такая же проблема с Тип 4 драйвер. Но!--10-->тип 1 драйвер не дает это исключение. Так что в настоящее время я использую тип 1 драйвер.

проверьте номер порта, sid at tnsnames.ora

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

решение 2 :

установить vmware на вашем компьютере установите ОС, затем программа будет работать с Тип 4 драйвер.


Я знаю, что эта тема немного старая, но вот что сработало для меня.

проверьте соединение с помощью клиента Oracle db, такого как SQL developer или что-то еще, чтобы убедиться, что строка соединения работает и может подключиться к БД с ним. Если вы используете Oracle db Express Edition, который является XE, SID-это XE, а порт-1521 независимо от того, где работает веб-клиент. вы также можете проверить это в настройках веб-клиента и других местах.


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

после этого вы не получите исключение.