通过 java 从网络机器连接到 Oracle 11g 失败

Posted

技术标签:

【中文标题】通过 java 从网络机器连接到 Oracle 11g 失败【英文标题】:Connection to Oracle 11g from network machine fails via java 【发布时间】:2016-09-14 10:20:57 【问题描述】:

我在 192.168.1.217 上运行 orace 11g,我正在尝试使用带有 java 的 JDBC 驱动程序连接它,它给了我以下错误

IO Error: The Network Adapter could not establish the connection

我使用的库是 ojdbc6.jar

这是我的代码

public void makeOracleConnection() 
        try 
            Class.forName("oracle.jdbc.OracleDriver");
            oraCon = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.217:1521:orcl", "hr", "hr");
            oraStmt = oraCon.createStatement();
            oraRsStmt=oraCon.createStatement(ResultSet.CONCUR_READ_ONLY,ResultSet.TYPE_SCROLL_INSENSITIVE);
         catch (Exception e) 
            System.out.println("Error while making connection with Database  : " + e.getMessage());
        
    

我也尝试在 192.168.1.217 上 ping,然后 pin 成功。 TNSLISTENER 也在该机器上运行。 请帮忙。

请在此处查找打印堆栈跟踪

run:
java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection

    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:743)
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:657)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:560)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at test.oracle.makeOracleConnection(oracle.java:30)
    at test.oracle.<init>(oracle.java:21)
    at test.oracle.main(oracle.java:69)
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:470)
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:506)
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:595)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:230)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1452)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:496)
    ... 8 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:163)
    at oracle.net.nt.ConnOption.connect(ConnOption.java:159)
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:428)
    ... 13 more
BUILD SUCCESSFUL (total time: 1 second)

【问题讨论】:

我们需要有关该错误的更多信息。如果还记录了堆栈跟踪或其他任何内容,您应该发布它。您还应该确保某些东西实际上正在侦听 192.168.1.217 中的端口 1521(例如,在 Linux 上运行 ss -l "sport = :1521")。 它在windows机器上。 在已编辑的问题中查找打印堆栈跟踪 也许很愚蠢,但用户 hr 是否获得了连接权?我们多次遇到问题,操作为我们创建了一个 oracle 帐户,但他们忘记授予他连接的权利。看看这里***.com/questions/9447492/… 我可以使用 sqldeveloper 与 hr 建立联系,但是当我尝试使用远程机器时它不起作用 【参考方案1】:

你得到错误

java.net.ConnectException: Connection refused: connect

这意味着在您尝试连接的机器和端口上没有任何监听。您的 Java 代码看起来是正确的,因此我将继续调查 Oracle 实际上正在侦听 192.168.1.217 上的端口 1521。

如果你在服务器上运行netstat -n,你应该会发现一行看起来像

TCP    [::]:1521              [::]:0                 LISTENING

如果确实有东西在那个端口上监听。如果您没有找到该行,请检查您的 Oracle 配置。

【讨论】:

显示一样,不同的是LISTENING被TIME_WAIT代替【参考方案2】:

尝试连接其他工具,例如 sqlplus,以验证问题不在于 Oracle。如果您无法与 sqlplus/sql developer 连接,请确保您的 oracle 配置为允许远程连接,并且还侦听给定的地址/端口

【讨论】:

sqlplus 工作正常。并且 tnsnames.ora 文件在端口 1521 上有 tcp 连接,带有 sid orcl hmm.. 好的,所以也许有一些奇特的防火墙规则会阻止您的连接? 我已禁用防火墙 好的,当你通过 sqlplus 连接时,你使用的是 hr 帐户还是一些内置的?也许数据库处于挂载状态(但未启动),您需要使用 dba 凭据登录并正确启动它(只是一个幸运的猜测,我的想法已经用完了)【参考方案3】:
public void makeOracleConnection() 
    try 
        Class.forName("oracle.jdbc.OracleDriver");
        Connection oraCon = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.217:1521:orcl", "hr", "hr");
        Statement oraStmt = oraCon.createStatement();
        //oraRsStmt=oraCon.createStatement(ResultSet.CONCUR_READ_ONLY,ResultSet.TYPE_SCROLL_INSENSITIVE);
        ResultSet rs = oraStmt.executeQuery("select hello as result from dual");

        while(rs.next()) 
             System.out.println(rs.getString("result"));
         
     
    catch (Exception e)
        System.out.println("Error while making connection with Database  : " + e.getMessage());
    

试试这个。希望它会有所帮助。我也不喜欢你的连接路径。这样对吗?我认为应该是这样的:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=YES)(ADDRESS=(PROTOCOL=tcp)(HOST=ip adres)(PORT=port)))(CONNECT_DATA=(SERVICE_NAME = orcl)))","username","password"

【讨论】:

如果有帮助请告诉我)

以上是关于通过 java 从网络机器连接到 Oracle 11g 失败的主要内容,如果未能解决你的问题,请参考以下文章

*** 连接到该 *** 的远程机器的 IP

通过 Jumpbox/Proxy 从我的本地机器连接到远程 MySQL

是否可以从 Java 客户端通过网络访问 ODBC?

尝试从 Spark 连接到 Oracle

从 Java 连接到 Oracle DB 时出错

连接到 ssh 远程主机(在 *** 网络中)超时