java.sql. SQLException: исключение Io: Полученный минус один от чтения звонят во время соединения JDBC с оракулом

Привет я плохо знаком с 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)

Помогите мне разобраться в этом

6
задан BalusC 2 March 2010 в 14:51
поделиться

3 ответа

Во-первых, неверный URL-адрес подключения. Post 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 излишне затратна. Просто сделайте это один раз во время запуска приложения или инициализации сервлета.

10
ответ дан 9 December 2019 в 22:32
поделиться

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

1
ответ дан 9 December 2019 в 22:32
поделиться

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

например

while (!rs.next()){
  //read rs.getString(1);
}
1
ответ дан 9 December 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: