【问题标题】:JDBC Connection works on Windows but does not work on UbuntuJDBC 连接适用于 Windows,但不适用于 Ubuntu
【发布时间】:2013-12-02 04:22:58
【问题描述】:

我有一段非常简单的 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) 在 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) 在 java.sql.DriverManager.getConnection(DriverManager.java:571) 在 java.sql.DriverManager.getConnection(DriverManager.java:215) 在 utils.OracleJDBC.getConnection(OracleJDBC.java:26) 在 utils.TestMain.main(TestMain.java:6) 原因: oracle.net.ns.NetException:网络适配器无法建立 连接在 oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:392) 在 oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:434) 在 oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:687) 在 oracle.net.ns.NSProtocol.connect(NSProtocol.java:247) 在 oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1102) 在 oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:320) ... 8 更多原因:java.net.ConnectException:连接被拒绝 java.net.PlainSocketImpl.socketConnect(Native Method) 在 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) 在 java.net.Socket.connect(Socket.java:579) 在 oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:150) 在 oracle.net.nt.ConnOption.connect(ConnOption.java:133) 在 oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:370) ... 13 更多

我登录:sqlplus sys as sysdba

我启动了数据库:启动

我以 userir 身份登录 Oracle。 XE 存在。

我不知道,我做错了什么......

提前感谢您的提示!

【问题讨论】:

  • 几件事:您的 ubuntu 机器是否托管 Oracle 实例?如果不是,您的连接字符串指向 localhost 并且需要更新。二:您提到您尝试了很多解决方案,您尝试了什么?
  • 您好,感谢您的回答。我不明白你的解决方案。我应该如何更新这个字符串?我尝试更改用户,我检查了端口是否正常以及所有凭据。
  • Oracle 真的在 Linux 机器上运行吗?还是仅在您的 Windows 计算机上?
  • 我在 Windows 上做了所有事情。之后,我在 Linux 上安装了 oracle 并启动了数据库。我在本地运行的所有内容。问题出在这个端口上。我在下面的 cmets 中写道,我收到了哪个错误
  • 数据库是否监听同一个端口?

标签: java oracle ubuntu jdbc


【解决方案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 连接,则该字符串由连接属性组成:

现在最困难的部分是你是否真的是本地主机并且需要从那里找出连接字符串。

首先,尝试使用您的 IP 地址而不是 localhost(在我的屏幕截图中为 192.168.0.106)来创建如下字符串:

"jdbc:oracle:thin:user/pass@//192.168.0.106:1521/remote_SID";

如果这不起作用,请检查您的防火墙,确保端口 1521 已打开(假设您没有更改端口设置,如果您更改了相应的文本)

如果仍然没有解决方案,您需要查看您的侦听器文件。如果是这种情况,我将链接到一些文档,并请遵照一些更高级的 Oracle/Linux 大师的意见

【讨论】:

  • 谢谢。你能告诉我如何找到合适的字符串吗?我不得不说,我是 Oracle 的初学者
  • 你从 sqlplus 中指定了什么?您的连接字符串在那里使用,或者如果它是远程计算机,您应该能够删除 IP 地址来代替 localhost 并且它应该可以工作
  • 好的,但是如何在 sqlplus 中找到这个字符串?
  • 是的,我看到了。当我回复@Bob Kuhar 时,我遇到了这个问题:telnet localhost 1521 Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection denied
  • 我个人认为你的听众没有……在听。检查我专门为您的 Oracle 版本添加的链接。我敢打赌你的答案会在那里。该服务很可能没有运行。
【解决方案2】:

我猜你有一些防火墙或一些网络东西阻止你从你的 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,不是吗?也许在linux机器上shell,看看你是否可以telnet到1521的oracle主机

telnet localhost 1521

您是否也在那里被拒绝连接?我猜 Linux 机器出于某种原因(防火墙或 oracle 侦听器未运行)没有打开端口 1521。

另外,您确定要在部署到 Linux 时连接到它的本地主机,还是期望 Oracle 服务器位于另一台机器上?如果 Oracle 服务器位于另一台机器上,则该机器的名称需要在连接字符串中,而不是“localhost”。

欢迎来到 JDBC 最糟糕的部分;找出该死的连接字符串。

【讨论】:

  • 本地主机没问题。我想在本地运行它。你是对的... telnet localhost 1521 Trying 127.0.0.1 ... telnet:无法连接到远程主机:连接被拒绝。我该如何解决?
【解决方案3】:

问题在于安全随机收集。

根据SO Discussion,Oracle JDBC 驱动程序尝试从操作系统获取安全随机数,作为与 Oracle 建立连接的一部分。问题是您的操作系统(Ubuntu)没有足够的随机数来回馈并阻止您,直到它保护您的请求(Oracle JDBC 驱动程序的请求)。

一个解决方案是要求 Oracle JDBC 驱动程序避免阻塞,直到获得完整的请求随机并使用它找到的任何内容。为此,您必须使用-Djava.security.egd=file:///dev/urandom

有关上述SO Discussion 的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2015-01-12
    相关资源
    最近更新 更多