java - 从 Java 到 Oracle 的连接不可靠

标签 java oracle

我是 Java 新手,正在尝试从 Redhat Linux 计算机设置到 Oracle 数据库的连接。我已经使连接正常工作,并且可以执行一个简单的 sql 脚本,但连接只能工作大约。 3次中有1次。它给出的错误和代码如下。这很可能是我们网络的问题,但在提出支持案例之前,我想了解更多知识。有谁知道当连接中指定了“someserver”时,为什么 ssdb0255n21-oravip 的错误显示“名称或服务未知”?

Exception in thread "main" java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:673)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:187)
    at OracleTest.main(OracleTest.java:19)
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:445)
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:464)
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:594)
    at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:214)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
    ... 7 more
Caused by: java.net.UnknownHostException: ssdb0255n21-oravip: Name or service not known
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:894)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1286)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1239)
    at java.net.InetAddress.getAllByName(InetAddress.java:1155)
    at java.net.InetAddress.getAllByName(InetAddress.java:1091)
    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:411)
    ... 13 more

我使用的代码是这个

import java.sql.*;
import java.util.Properties;

public class OracleTest
{
  public static void main(String[] args) throws SQLException
  {
    String url = "jdbc:oracle:thin:@ldaps://someserver:3131/ODBF2_BLOOD_P_S_B_001,cn=OracleContext,dc=in,dc=companyname,dc=com,dc=au";

    //properties for creating connection to Oracle database
    Properties props = new Properties();
    props.setProperty("user", "xxx");
    props.setProperty("password", "xxxx");

    //creating connection to Oracle database using JDBC
    System.out.println(DriverManager.getLoginTimeout());
    Connection conn = DriverManager.getConnection(url,props);

    String sql ="select sysdate as current_day from dual";

    //creating PreparedStatement object to execute query
    PreparedStatement preStatement = conn.prepareStatement(sql);

    ResultSet result = preStatement.executeQuery();

    while(result.next())
    {
      System.out.println("Current Date from Oracle : " +         result.getString("current_day"));
    }
    System.out.println("done");

  }
}

我将 ORACLE_HOME 设置为/usr/lib/oracle/10.2.0.5/client64/并在/usr/lib/oracle/10.2.0.5/client64/network/admin 中创建了 ldap.ora 和 sqlnet.ora 文件。这些内容是:

sqlnet.ora

NAMES.DIRECTORY_PATH = (LDAP,TNSNAMES)

ldap.ora

DIRECTORY_SERVERS = (OID.GLB.IN.companyname.COM.AU::3131)
DEFAULT_ADMIN_CONTEXT = "dc=in,dc=companyname,dc=com,dc=au"
DIRECTORY_SERVER_TYPE = OID

它似乎自己创建了 tnsnames.ora

ORA11 =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = ORA11)
 )
)

最佳答案

我不想回答自己的问题,但事实证明这不是 Oracle 的问题。这是 DNS 解析失败的问题。我将 ssdb0255n21-oravip 主机放入/etc/hosts 文件中,问题立即消失。我怀疑某处的负载均衡器将 50% 的 DNS 查找定向到返回错误的 DNS 服务器。我们这里有一个非常复杂的网络:-)

关于java - 从 Java 到 Oracle 的连接不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17479777/

相关文章:

java - Spring java 配置扩展抽象配置

java - FileInputStream 是否已经在使用缓冲区?

java - WireMock 失败并出现 NoSuchMethodError HttpServletResponse.getHeader

sql - 如何用文字显示数值

sql - Oracle TO_CHAR(timestamp) 和timestamp 分秒不同

oracle - 'ORA-00942 : table or view does not exist' only when running within a Stored procedure

oracle - 类似结果的 Oracle PARTITION BY 与 GROUP BY 的解释

java - Annotation Processor - 如何获取它正在处理的类

java - 使用 jackson-dataformat-xml 转义引号

MySQL 与 SQL Server 与 Oracle