尝试连接数据库时出现java.net.UnknownHostException

时间:2015-03-24 18:51:57

标签: java oracle unknown-host

我正在尝试通过Java使用Oracle JDBC驱动程序连接到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远程主机,我可以通过端口1521远程登录到远程主机。

为什么只有Java看起来会出现UnknownHostException,但是我可以连接并使用其他应用程序ping主机?

编辑:我删除了&#34; hr / hr&#34;来自上面的连接字符串。我已经尝试了连接,因为删除它仍然收到相同的错误。我也尝试更改连接字符串以匹配他的答案中列出的版本morgano,结果相同。最后,我尝试将端口号更改为我知道它没有监听的端口,并且它仍然收到相同的错误。

2 个答案:

答案 0 :(得分:0)

你的JDBC网址是错误的,根据documentation它应该是这样的:

  

JDBC:预言:driver_type:[用户名/密码] @ //主机:端口号/服务名

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

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 ();
    }
}

答案 1 :(得分:0)

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

在示例代码中,您写String host = "HOST_NAME";。这看起来就像在您的实际代码中一样,正在为变量host分配一个常量字符串。但是,我要伸出脖子说,在您的真实代码中,您没有这样做。您正在某个地方查找主机名,由于某种原因该查找失败,您没有进行检查,因此将空值传递给连接字符串。

相关问题