当前位置: 首页 > 知识库问答 >
问题:

JDBC连接在Windows上工作,但在Ubuntu上不工作

魏学智
2023-03-14

我有一段非常简单的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.sqlRecoverable异常:IO错误:网络适配器无法在oracle.jdbc.driver.T4CConnection处建立连接。登录(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)在.net.ns.nsprotocol.connect(Nsprotocol.Java:247)在oracle.jdbc.driver.t4cconnection.connect(T4cconnection.Java:1102)在oracle.jdbc.driver.t4cconnection.登录(T4cconnection.Java:320)...其他原因:Java.net.Connection Exception:Java.net.plainsockeTimpl.socketConnect(本机方法)在Java.net.abstractplainsockeTimpl.doConnect(

我以sysdba身份登录:sqlplus sys

我启动了db:startup

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

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

提前感谢您的提示!

共有2个答案

柯捷
2023-03-14

我猜是有防火墙或网络设备阻止了您从Linux box到oracle服务器的访问。请注意StackTrace的“Connection Refired”部分。

...
java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at 
...

Oracle监听端口1521,不是吗?也许可以在linux box上使用shell,看看是否可以直接telnet到oracle主机1521

telnet localhost 1521

你的连接也被拒绝了吗?我猜Linux box没有打开端口1521是因为任何原因(防火墙或oracle侦听器没有运行)。

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

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

沈淇
2023-03-14

验证连接字符串。

由于忘记使用正确的主机名更新localhost,我在各种数据库中都遇到过类似的问题。

  connection = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:" + dbname, username,
                password);

确保连接字符串与您在sqlplus中指定的内容相匹配,并且您应该很好。

正在查找连接字符串

确定连接字符串可能会比较困难,但由于您可以通过sqlplus进行连接,因此应该比较容易:

我的SqlPlus连接字符串看起来像:SqlPlus用户/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大师的文档

  • http://docs.oracle.com/html/b10812_06/chapter5.htm-用于10G Listener.ora信息
  • http://docs.oracle.com/cd/e11882_01/network.112/e10835/listener.htm#netrf008-用于11G listener.ora信息
  • http://docs.oracle.com/cd/e16655_01/network.121/e17610/listenercfg.htm#netag010-用于12c listener.ora信息
 类似资料:
  • 我试图制作一个跨平台的JavaFX应用程序,它在Windows和OSX机器上工作得很好,但在Linux上不行。 jar是在Intellij思想中使用基本的JavaFX配置构建的。 有人帮忙吗?

  • 我遵照这些指示: Windows全局安装PHAR的过程与在Windows上手动安装Composer的过程相同: 为PHP二进制文件创建目录;例如,C:\bin 追加;C:\bin到您的PATH环境变量(相关帮助) 下载https://phar.phpunit.de/phpunit-6.2.phar 并将文件另存为C:\bin\phpunit。法尔 打开命令行(例如,按Windows R»键入cmd

  • 这个问题在下面的示例中重现。 } 据我所知,发生此异常是因为多个线程试图保存同一个对象。这就是我使用同步块的原因。 null null

  • Windows---------------: Linux---------- 那么,什么是主要的原因是这个问题,看起来一切都好从其他的选择 Apache Maven 3.6.0(97C98EC64A1FDFEE7767CE5FFB20918DA4F719F3;2018-10-24T14:41:47-04:00)Maven主页:/home/user/tools/Maven/apache-maven

  • 结果在Windows和Linux之间有所不同。 Linux:鼠标位置:0,0 Windows:鼠标位置:623.0,367.0 我不知道为什么它不能在windows上工作,甚至似乎与lwjgl版本完全无关,因为我尝试了3.1.6、3.2.1、3.2.2和3.2.3-snapshot,所有这些版本都是一样的。所以问题要么是我在创建窗口时忘记了一些东西,要么是windows在某个更新中损坏了一些东西,

  • Peer.JS server.js github链接到项目:链接 新来的赫罗库。任何帮助都将不胜感激!