JDBC连接适用于Windows,但不适用于Ubuntu

时间:2013-11-18 20:49:52

标签: java oracle ubuntu jdbc

我有一段非常简单的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存在。

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

提前感谢您的提示!

3 个答案:

答案 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连接,则字符串由连接属性组成:

enter image description here

现在困难的部分是如果你真的是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的更多详情。