java.sql.SQLException: Io исключение: получил минус один от вызова чтения во время соединения JDBC с оракулом - PullRequest
6 голосов
/ 02 марта 2010

Привет, я новичок в Java, когда я попытался подключить оракул с моим примером кода 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 ]

10 голосов
/ 02 марта 2010

Во-первых, неправильный URL-адрес подключения. Post 8080 обычно используется таким веб-сервером, как Apache Tomcat. Сам Oracle использует порт по умолчанию 1521. Также см. в этой документации Oracle JDBC .

Далее вы забыли позвонить ResultSet#next(). Это установит курсор на следующую строку в наборе результатов. Набор результатов возвращается с курсором перед первой строкой. Любые вызовы getXXX() на ResultSet завершатся неудачно, если вы не переместите курсор.

Если вы ожидаете несколько строк в наборе результатов, то вам нужно использовать while loop:

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 неоправданно дорогая. Просто сделайте это один раз во время запуска приложения или инициализации сервлета.

1 голос
/ 02 марта 2010

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

например

while (!rs.next()){
  //read rs.getString(1);
}
1 голос
/ 02 марта 2010

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

0 голосов
/ 22 июня 2017
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")  

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

0 голосов
/ 05 мая 2015

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

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

0 голосов
/ 18 августа 2013

решение 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 .

0 голосов
/ 14 июня 2012
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;

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...