java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一
Posted
技术标签:
【中文标题】java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一【英文标题】:java.sql.SQLException: Io exception: Got minus one from a read call during JDBC connection with oracle 【发布时间】:2010-03-02 14:16:45 【问题描述】:您好,我是 java 新手,当我尝试将 oracle 与我的 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)
帮我解决这个问题
【问题讨论】:
【参考方案1】:首先,连接 URL 错误。 Post 8080 通常由像 Apache Tomcat 这样的网络服务器使用。 Oracle 本身使用默认端口 1521。另请参阅this Oracle JDBC documentation。
另外你忘了打电话给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 中),您可能会发现this article 很有用。例如,您关闭语句和连接的方式很容易导致资源泄漏。在 GET 请求上加载 JDBC 驱动程序也不必要地昂贵。只需在应用程序启动或 servlet 初始化期间执行一次。
【讨论】:
调试程序时发现 Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:8080:orcl", "system", "tiger") 抛出的异常;你能通过这条线吗 先修复连接URL。 Oracle 肯定不会监听 8080 端口。通常是 Tomcat 监听 8080,而不是数据库服务器。 Oracle 默认使用 1521。 我在另一条评论中看到您在使用 1521 时得到了 ORA 12505,在这种情况下,只需检查 ora-code.com:ora-12505.ora-code.com【参考方案2】:Oracle 通常使用端口 1521 进行数据库访问,而您似乎使用的是端口 8080。您应该检查以确保您指定了正确的端口。
【讨论】:
我也尝试使用 1521,但在这种情况下它拒绝连接数据库并出现 ora 12505 错误【参考方案3】:我看到的一个错误是您需要执行 rs.next(); 这将得到他的第一个结果集。
例如
while (!rs.next())
//read rs.getString(1);
【讨论】:
【参考方案4】: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;
【讨论】:
【参考方案5】:解决方案 1:
我认为这个异常是由于操作系统内部环境问题。
type 4 驱动程序也有同样的问题。但是 type 1 驱动程序没有给出这个异常。 所以目前我正在使用 type 1 驱动程序。
检查端口号,sid
tnsnames.ora
C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN\SAMPLE\tnsnames.ora
解决方案 2:
在您的计算机上安装 vmware,安装操作系统,然后程序将使用 type 4 驱动程序。
【讨论】:
【参考方案6】:我知道这个帖子有点老了,但这对我有用。
使用 oracle db 客户端(如 sql developer 或其他工具)检查连接,以确保连接字符串正常工作并能够使用它连接到数据库。 如果您使用的是 XE 的 Oracle db Express Edition, 无论 Web 客户端在哪里运行,SID 都是 XE,端口是 1521。您也可以从 Web 客户端设置和其他地方进行检查。
【讨论】:
【参考方案7】: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")
在此之后你不会得到异常。
【讨论】:
这个问题已经在 3 个多月前收到了一个接受的、赞成的答案,而您迟到的答案并没有增加任何新内容。 @ChristianKönig 当我搜索这个时,我没有得到合适的答案。 您在写答案的确切页面上 - 滚动到顶部并阅读 BalusC 提供的答案 - 它以 开头首先,连接 URL 错误。 Post 8080 通常由像 Apache Tomcat 这样的网络服务器使用。 Oracle 本身使用默认端口 1521。以上是关于java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException:Io 异常:指定了未知主机
java.sql.SQLException: Io 异常: Socket closed
java.sql.SQLException: Io 异常: Broken pipe 如何在不重启的情况下恢复?
java.sql.SQLException: Io 异常: Socket read timed out
java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一
java.sql.SQLException: Io 异常: Got minus one from a read call