java.sql.SQLException:Ioexception:在与oracle的JDBC连接期间从读取调用中减去了一个

嗨,当我尝试使用我的java示例代码连接oracle时,我是java的新手,我得到了上述exception

我的代码是

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(); } } } 

抛出的exception是

 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.(PhysicalConnection.java:441) at oracle.jdbc.driver.T4CConnection.(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等Web服务器使用。 Oracle本身使用默认端口1521.另请参阅此Oracle JDBC文档 。

此外,您忘记调用ResultSet#next() 。 这会将光标设置为结果集中的下一行。 返回结果集,光标位于第一行之前 。 如果不移动光标,则对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初始化期间执行一次。

通常,Oracle使用端口1521进行数据库访问,而您似乎正在使用端口8080。 您应该检查以确保指定了正确的端口。

我看到的一个错误是你需要做一个rs.next(); 这将得到他的第一个结果集。

例如

 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驱动程序的相同问题。 但是类型1驱动程序没有给出此exception。 所以目前我正在使用1型驱动程序。

检查端口号, sidtnsnames.ora

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

解决方案2:

在您的计算机上安装vmware ,安装操作系统,然后程序将使用类型4驱动程序。

我知道这个post有点旧,但这对我有用。

使用oracle数据库客户端(如sql developer或其他东西)检查连接,以确保连接字符串正常工作并能够使用它连接到数据库。 如果您使用的是XE的Oracle db Express Edition,则无论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") 

在此之后,您不会得到例外。