【问题标题】:java.net.UnknownHostException when attempting to connect to database尝试连接到数据库时出现 java.net.UnknownHostException
【发布时间】:2015-05-28 05:39:09
【问题描述】:

我正在尝试使用 Oracle JDBC 驱动程序通过 Java 连接到 Oracle 数据库,并使用以下代码(隐藏主机、服务、用户和密码):

import java.sql.*;

public class Main {
    public Main () {
        try {
            String host = "HOST_NAME";
            String port = "1521";
            String service = "SERVICE_NAME";
            String user = "SCHEMA_USER";
            String password = "SCHEMA_PASSWORD";

            Class.forName("oracle.jdbc.driver.OracleDriver");

            Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + 
                        host + 
                        ")(PORT=" + 
                        port + 
                        ")))(CONNECT_DATA=(SERVICE_NAME=" + 
                        service + 
                        ")))", 
                        user, 
                        password);

            connection.close ();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main (String args) {
        new Main ();
    }
}

但是,我收到以下错误:

java.sql.SQLException: IO Error: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.acxiom.axle.reporting.database.DatabaseConnection.connect(DatabaseConnection.java:23)
    at com.acxiom.axle.reporting.Reporting.establishDatabaseConnection(Reporting.java:53)
    at com.acxiom.axle.reporting.Reporting.beginReporting(Reporting.java:20)
    at com.acxiom.axle.reporting.Entry.<init>(Entry.java:28)
    at com.acxiom.axle.reporting.Entry.main(Entry.java:118)
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
    at 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)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:247)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1102)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:320)
    ... 11 more
Caused by: java.net.UnknownHostException: null
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(Unknown Source)
    at java.net.InetAddress.getAddressesFromNameService(Unknown Source)
    at java.net.InetAddress.getAllByName0(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at java.net.InetAddress.getAllByName(Unknown Source)
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:117)
    at oracle.net.nt.ConnOption.connect(ConnOption.java:133)
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:370)
    ... 16 more

奇怪的是,我可以从 PL/SQL Developer 连接到数据库,可以 ping 远程主机,还可以 telnet 到远程主机的 1521 端口。

为什么似乎只有 Java 会给出 UnknownHostException,但我可以将主机与其他应用程序连接并 ping 通?

编辑:我从上面的连接字符串中删除了“hr/hr”。我已按原样尝试连接,但仍会收到相同的错误。我还尝试更改连接字符串以匹配他的答案中列出的版本 morgano,结果相同。最后,我尝试将端口号更改为我知道它没有在侦听的端口,但它仍然收到相同的错误。

【问题讨论】:

  • @PeterMmm 我很确定我已经排除了 EJP 在该问题中列出的三个原因。数据库肯定正在运行,因为我可以通过 PL/SQL Developer 和 telnet 连接到它,这也排除了防火墙问题。至于 URL,我直接从 tnsnames.ora 复制过来的,所以和 PL/SQL Developer 使用的 URL 一样。
  • 我也试过指定服务器的IP地址而不是域名,导致同样的异常。
  • 我可能是错的,但对我来说,您似乎指定了用户名和密码两次。一次作为 hr/hr(我猜这是来自示例应用程序?),而不是使用用户、密码);我会尝试的是汤姆删除小时/小时
  • 我尝试删除“hr/hr”部分,并按照下面 morgano 的建议更改连接字符串,但仍然没有成功:/

标签: java oracle unknown-host


【解决方案1】:

连接字符串的格式正确。问题是没有设置主机。它是null,或者可能是字符串"null"。根本没有其他方法可以生成错误消息java.net.UnknownHostException: null

在您的示例代码中,您编写String host = "HOST_NAME";。这使得在您的真实代码中看起来您正在为变量host 分配一个常量字符串。但是,我会伸出脖子说,在你的真实代码中你没有这样做。您正在从某处查找主机名,此查找由于某种原因失败,您没有检查此内容,因此您将空值传递给连接字符串。

【讨论】:

    【解决方案2】:

    您的 JDBC url 错误,根据 documentation 应该是这样的:

    jdbc:oracle:driver_type:[用户名/密码]@//host_name:port_number/service_name

    在您的情况下,您的代码将类似于:

    import java.sql.*;
    
    public class Main {
    
        public Main () {
            try {
                String host = "HOST_NAME";
                String port = "1521";
                String service = "SERVICE_NAME";
                String user = "SCHEMA_USER";
                String password = "SCHEMA_PASSWORD";
    
                Class.forName("oracle.jdbc.driver.OracleDriver");
    
                Connection connection = DriverManager.getConnection(
                    "jdbc:oracle:thin:@//" + host
                    + ":" + port + "/" + service, user, password);
    
                connection.close ();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main (String args) {
            new Main ();
        }
    }
    

    【讨论】:

    • 我尝试像在您的示例中一样指定它,但我仍然收到相同的错误。我的原始连接字符串使用与 tnsnames.ora 文件中相同的格式进行格式化
    • 司机的鬃毛,试试:oracle.jdbc.OracleDriver而不是oracle.jdbc.driver.OracleDriver
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2014-06-10
    相关资源
    最近更新 更多