oracle - 使用瘦 JDBC 客户端通过 LDAP/OID 查找解决 Oracle SID 的问题

标签 oracle jdbc ldap oid tns

我们正在为我们的连接配置使用 OID/LDAP 查找。 TNS_ADMIN 环境变量和 oracle.net.tns_admin Java 属性均已正确设置并指向包含 sqlnet.ora 和 ldap.ora 的目录。但是,JDBC 连接 URL:jdbc:oracle:thin:@ourtnsalias 在尝试连接时抛出异常:

java.sql.SQLRecoverableException: IO Error: could not resolve the connect identifier  "ourtnsalias"
        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(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at TnsTest.main(TnsTest.java:29)
Caused by: oracle.net.ns.NetException: could not resolve the connect identifier  "tnsalias"
        at oracle.net.resolver.NameResolver.resolveName(NameResolver.java:181)
        at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:416)
        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)
        ... 7 more
Exception in thread "main" java.lang.NullPointerException
        at TnsTest.main(TnsTest.java:46)

以下类型的连接字符串成功连接:

  • 完整的 TNS 字符串:
    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host.company.com)(PORT=####))(CONNECT_DATA=(SERVICE_NAME=service_name)))
  • 完整的 LDAP 网址:
    jdbc:oracle:thin:@ldap://oid.company.net:####/ourtnsname,CN=OracleContext,dc=company,dc=net

这似乎暗示问题出在 LDAP/OID 查找上。但是,运行 tnsping ourtnsname 也可以成功连接。

在进行 OID/LDAP 查找时,有没有办法在连接字符串中只使用 TNS 别名?

为了完整起见,这里是相关的 Java:

String connectionURL = "jdbc:oracle:thin:@ourtnsalias";
System.setProperty("oracle.net.tns_admin", "c:/oracle/network/admin");
Class.forName("oracle.jdbc.OracleDriver");
Connection c = DriverManager.getConnection(connectionURL, userid, password);

最佳答案

用这个把我的头撞到墙上后,结果证明我们的问题是 TNS 名称条目在多行中有无效的制表符/间距,导致它无法正确解析。

在我们的案例中,令人惊讶的是 TNSPING 能够正确解析 TNSNAMES.Ora 文件,但 jdbc Oracle Driver 却不能。

删除 TNSNAmes 条目中的所有空格,然后小心地将其添加回去,注意此处描述的规则:

http://docs.oracle.com/cd/A57673_01/DOC/net/doc/NWUS233/apb.htm

帮助我们解决了问题。

让我们得到答案的是,当更改连接标识符时,我们会得到一个不同的错误,即从这里切换:

jdbc:oracle:thin:@ourtnsalias

收件人:

jdbc:oracle:thin:@unknown

给出了不同的错误(连同检查 sysinternals 进程监视器以​​确保实际读取了 TNSNAmes.ora 文件)表明它正在解析 TNS 文件,但是条目有问题导致了错误上。

我不禁认为,如果 JDBC Oracle 客户端返回一个更有意义的错误,即“无法解析连接标识符的 TNS 条目”,那么所有这些问题都可以轻松解决!

希望这对其他人有帮助:)

关于oracle - 使用瘦 JDBC 客户端通过 LDAP/OID 查找解决 Oracle SID 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10758674/

相关文章:

java - JDBC - 空检查关闭函数

java - Postgresql 9.3 - JDBC 连接错误

oracle - 在 SQL PLUS ORACLE 11gr1 上使用 DATABASE 命令

oracle - 错误oracle sql developer "SQL command not properly ended"

maven - 在当前项目中找不到前缀 'install' 的插件

linux - 当上下文名称中有 '#' 符号时,ldap_explode_dn() 中的问题

c++ - Windows 服务上基于 SSL 的 LDAP

linux - 使用一个静态 IP 通过互联网在多个服务器之间进行通信

mysql - 可以获取表 1 中存在但表 2 中不存在的记录的 SQL 查询

oracle - 如何修复 "Unable to instantiate JDBC driver"Flyway命令行错误?