嗨,当我尝试使用我的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)
帮我解决这个问题
答案 0 :(得分:10)
首先,连接URL错误。 Post 8080通常由Apache Tomcat等Web服务器使用。 Oracle本身使用默认端口1521.另请参阅this Oracle JDBC documentation。
此外,您忘记致电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中),您可能会发现this article非常有用。例如,关闭语句和连接的方式容易导致资源泄漏。在GET请求上加载JDBC驱动程序也是非常昂贵的。只需在应用程序启动或servlet初始化期间执行一次。
答案 1 :(得分:1)
通常,Oracle使用端口1521进行数据库访问,而您似乎正在使用端口8080。您应该检查以确保指定了正确的端口。
答案 2 :(得分:1)
我看到的一个错误是你需要做一个rs.next(); 这将得到他的第一个结果集。
例如
while (!rs.next()){
//read rs.getString(1);
}
答案 3 :(得分:0)
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;
}
}
}
答案 4 :(得分:0)
解决方案1:
我认为这个例外是由于操作系统内部环境问题造成的。
我的 type 4 驱动程序遇到了同样的问题。但类型1 驱动程序没有给出此异常。 所以目前我正在使用 类型1 驱动程序。
检查sid
tnsnames.ora
C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN\SAMPLE\tnsnames.ora
解决方案2:
在您的计算机上安装vmware ,安装操作系统,然后程序将与 type 4 驱动程序一起使用。
答案 5 :(得分:0)
我知道这个帖子有点旧,但这对我有用。
使用oracle数据库客户端(如sql developer或其他方法)检查连接,以确保连接字符串正常工作并能够使用它连接到数据库。 如果您使用的是XE的Oracle db Express Edition, 无论Web客户端运行在何处,SID都是XE,端口是1521。您也可以从Web客户端设置和其他位置进行检查。
答案 6 :(得分:-1)
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")
在此之后你不会得到例外。