Привет я плохо знаком с 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)
Помогите мне разобраться в этом
Во-первых, неверный 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 излишне затратна. Просто сделайте это один раз во время запуска приложения или инициализации сервлета.
Обычно Oracle использует порт 1521 для доступа к базе данных, а вы, похоже, используете вместо него порт 8080. Вам следует убедиться, что вы указали правильный порт.
Одна из ошибок, которую я вижу, заключается в том, что вам нужно выполнить rs.next(); Это приведет к первому набору результатов.
например
while (!rs.next()){
//read rs.getString(1);
}