我有一段非常简单的JAVA代码,我尝试从JAVA连接到我的Oracle DB。
一切都在Windows下运行,但是当我尝试在Ubuntu上运行时,我遇到了错误。
我读了很多,我尝试了很多解决方案。这是我的代码:
package utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class OracleJDBC {
private static String driver = "oracle.jdbc.driver.OracleDriver";
private static String password = "*****";
private static String dbname = "XE";
private static String username = "userir";
public Connection getConnection() {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
Connection connection = null;
try {
connection = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:" + dbname, username,
password);
} catch (SQLException e) {
System.out.println("Connection Failed");
e.printStackTrace();
return null;
}
return connection;
}
public void closeConnection(Connection connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
当我运行它时,我收到一个错误:
连接失败java.sql.SQLRecoverableException:IO错误: 网络适配器无法建立连接 oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458)at at oracle.jdbc.driver.PhysicalConnection。(PhysicalConnection.java:546) 在oracle.jdbc.driver.T4CConnection。(T4CConnection.java:236) 在 oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 在oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)at java.sql.DriverManager.getConnection(DriverManager.java:571)at java.sql.DriverManager.getConnection(DriverManager.java:215)at utils.OracleJDBC.getConnection(OracleJDBC.java:26)at utils.TestMain.main(TestMain.java:6)引起: oracle.net.ns.NetException:网络适配器无法建立 连接在 oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:392)at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:434) at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:687) 在oracle.net.ns.NSProtocol.connect(NSProtocol.java:247)at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1102)at at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:320)... 8 更多由:java.net.ConnectException:连接被拒绝 java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)at java.net.Socket.connect(Socket.java:579)at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:150)at at oracle.net.nt.ConnOption.connect(ConnOption.java:133)at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:370)... 13更多
我已登录:sqlplus sys as sysdba
我开始使用db:startup
我以userir身份登录Oracle。 XE存在。
我不知道,我做错了什么......
提前感谢您的提示!
答案 0 :(得分:1)
验证您的连接字符串。
我遇到过各种数据库的类似问题,因为我忘了使用正确的主机名更新localhost。
connection = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:" + dbname, username,
password);
确保连接字符串与您在sqlplus中指定的连接字符串匹配,并且您应该是好的。
查找连接字符串
确定连接字符串可能很困难,但是您可以通过sqlplus连接它应该更容易一些:
我的SqlPlus连接字符串如下所示:sqlplus user/pass@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=hostname.network)(Port=1521))(CONNECT_DATA=(SID=remote_SID)))
如果我将它带入Java,它现在看起来像:
"jdbc:oracle:thin:user/pass@//hostname.network:1521/remote_SID";
或者,如果通过SQLDeveloper连接,则字符串由连接属性组成:
现在困难的部分是如果你真的是localhost并且需要从那里找出连接字符串。
首先,尝试使用您的IP地址而不是localhost(在我的屏幕截图中,192.168.0.106)来创建一个字符串:
"jdbc:oracle:thin:user/pass@//192.168.0.106:1521/remote_SID";
如果这不起作用,请检查防火墙,确保端口1521已打开(假设您没有更改端口设置,如果您这样做,则相应地更改文本)
如果仍然没有解决方案,您需要检查您的侦听器文件。如果是这样的话,我将链接到一些文档,并且请一些更高级的Oracle / Linux大师
答案 1 :(得分:0)
我猜是你有一些防火墙或一些网络阻止你从你的Linux盒子到你的oracle服务器。请注意堆栈跟踪的“连接被拒绝”部分..
...
java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at
...
Oracle侦听端口1521,不是吗?也许shell在linux上,看看你是否可以telnet到1521的oracle主机
telnet localhost 1521
你是否也拒绝了连接?我猜测Linux盒子因为某种原因没有打开端口1521(防火墙或oracle监听器没有运行)。
此外,您确定在部署到Linux时要连接到的本地主机还是期望Oracle服务器位于不同的计算机上?如果Oracle服务器位于不同的计算机上,则该计算机的名称必须位于连接字符串中,而不是“localhost”。
欢迎来到JDBC最糟糕的部分;找出怪异的连接字符串。
答案 2 :(得分:0)
问题在于安全的随机收集。
根据此SO Discussion,Oracle JDBC驱动程序尝试从作为与Oracle建立连接的一部分的操作系统中获取安全随机数。问题是你的操作系统(Ubuntu)没有足够的random来回馈并阻止你直到它保护你的请求(Oracle JDBC Driver的请求)。
解决方案是让Oracle JDBC Driver避免阻塞,直到获得完整的请求随机并使用它找到的任何内容。为此,您必须使用-Djava.security.egd=file:///dev/urandom
。
有关上述SO Discussion的更多详情。