尝试连接到数据库时发生java.net.UnknownHostException

尝试连接到数据库时发生java.net.UnknownHostException,java,oracle,unknown-host,Java,Oracle,Unknown Host,我正试图使用Oracle JDBC驱动程序通过Java连接到Oracle数据库,代码如下(隐藏主机、服务、用户和密码): 但是,我收到以下错误: java.sql.SQLException:IO错误:网络适配器无法建立连接 位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458) 位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546) 位于o

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

但是,我收到以下错误:

java.sql.SQLException: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(未知源)
位于java.sql.DriverManager.getConnection(未知源)
位于com.acxiom.axex.reporting.database.DatabaseConnection.connect(DatabaseConnection.java:23)
在com.acxiom.axex.reporting.reporting.buildDatabaseConnection(reporting.java:53)上
在com.acxiom.axex.reporting.reporting.beginReporting(reporting.java:20)上
在com.acxiom.axex.reporting.Entry.(Entry.java:28)
位于com.acxiom.axex.reporting.Entry.main(Entry.java:118)
原因:oracle.net.ns.NetException:网络适配器无法建立连接
在oracle.net.nt.connstategy.execute(connstategy.java:392)
位于oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:434)
位于oracle.net.ns.NSProtocol.buildConnection(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)
... 还有11个
原因:java.net.UnknownHostException:null
在java.net.Inet6AddressImpl.lookupAllHostAddr(本机方法)
位于java.net.InetAddress$2.lookupAllHostAddr(未知源)
位于java.net.InetAddress.getAddressesFromNameService(未知源)
位于java.net.InetAddress.getAllByName0(未知源)
位于java.net.InetAddress.getAllByName(未知源)
位于java.net.InetAddress.getAllByName(未知源)
位于oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:117)
位于oracle.net.nt.connpoption.connect(connpoption.java:133)
在oracle.net.nt.connstategy.execute(connstategy.java:370)
... 还有16个
奇怪的是,我可以从PL/sqldeveloper连接到数据库,我可以ping远程主机,我可以telnet到端口1521上的远程主机

为什么只有Java看起来会给出一个未知的hostException,但我可以用其他应用程序连接并ping主机


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

您的JDBC url错误,根据

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 ();
    }
}
jdbc:oracle:driver\u 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 ();
    }
}

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


在示例代码中,编写
stringhost=“host\u NAME”。这使它看起来像是在实际代码中为变量
host
分配了一个常量字符串。然而,我要冒着风险说,在你真正的代码中,你没有这样做。您正在从某处查找主机名,由于某种原因,此查找失败,您没有检查此项,因此您将空值传递到连接字符串。

请阅读@petermm此处,我非常确定我已经排除了EJP在该问题中列出的三个原因。数据库肯定正在运行,因为我可以通过PL/sqldeveloper和telnet连接到它,这也排除了防火墙问题。至于URL,我直接从tnsnames.ora复制了它,因此与PL/SQL Developer使用的URL相同。我还尝试指定服务器的IP地址,而不是域名,这导致了相同的异常。我可能错了,但对我来说,您似乎指定了用户名和pw两次。一次作为hr/hr(我猜是来自示例应用程序?),而不是使用用户、密码);我想尝试的是tom删除hr/hrI尝试删除“hr/hr”部分,并按照下面morgano的建议更改连接字符串,仍然没有成功:/i我尝试指定它,就像在您的示例中一样,但仍然收到相同的错误。我的原始连接字符串的格式与tnsnames.ora文件中的格式相同。请尝试:
oracle.jdbc.OracleDriver
而不是
oracle.jdbc.driver.OracleDriver