开发者

java.sql.SQLException: Io exception: Got minus one from a read call during JDBC connection with oracle

Hi I am new to java when I tried to connect oracle with my java sample code I got the above exception

My Code is

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

}

and The exception thrown is

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.T4CConnec开发者_StackOverflowtion.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)

Help me to sort out this


First, the connection URL is wrong. Post 8080 is normally used by a webserver like Apache Tomcat. Oracle itself uses a default port of 1521. Also see this Oracle JDBC documentation.

Further you forgot to call ResultSet#next(). This will set the cursor to the next row in the result set. The result set is returned with the cursor before the first row. Any getXXX() calls on the ResultSet will fail if you don't move the cursor.

If you expect multiple rows in a result set, then you need to use while loop:

resultSet = statement.executeQuery();
while (resultSet.next()) {
    String columnname = resultSet.getString("columnname");
    // ...
}

Or if you expect only one row, then you can also go ahead with an if statement:

resultSet = statement.executeQuery();
if (resultSet.next()) {
    String columnname = resultSet.getString("columnname");
    // ...
}

For more hints and examples of using basic JDBC the right way (also in JSP/Servlet) you may find this article useful. The way you closed the statement and connection for example is prone to resource leaking. Also loading the JDBC driver on GET request is unnecessarily expensive. Just do it once during application's startup or servlet's initialization.


Typically Oracle uses port 1521 for database access and you appear to be using port 8080 instead. You should check to make sure you have specified the correct port.


One error i see is that you need to do a rs.next(); This will get tot he first resultset.

for example

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;

        }
    }
}


solution 1 :

I think this exception is due to operating system internal environment problem.

I have got same problem with type 4 driver. But type 1 driver not giving this exception. So that currently I'm using type 1 driver.

Check port number, sid at tnsnames.ora

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

solution 2 :

install vmware on your computer, install OS, then program will work with type 4 driver.


I know this thread is a bit old, but here is what worked for me.

check the connection using a oracle db client like sql developer or something else to make sure the connection string is working and able to connect to the db with it. If you are using Oracle db Express Edition which is XE, SID is XE and port is 1521 no matter where the web client is running. you can also check this from the web client settings and other places.


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

Here you find the file like this:

**abcd** =
     (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = **1521**))
           (CONNECT_DATA =
            (SERVER = DEDICATED)
            (SERVICE_NAME = abcd)
        )
     ) 

Now you write your connection as follow:

  ("jdbc:oracle:thin:@localhost:1521:abcd","your_db_name","your_password")  

After this you don't get the exception.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜