使用Thin JDBC Client通过LDAP / OID查找解决Oracle SID的问题

时间:2012-05-25 17:13:01

标签: 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);

3 个答案:

答案 0 :(得分:2)

用这个把头撞到墙上之后,事实证明我们的问题是TNS名称条目在多行上有无效的标签/间距,导致它无法正确解析。

在ourt案例中,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条目”,我不禁想到所有这些都可以轻松解决!

希望这有助于其他人:)

答案 1 :(得分:0)

我不是程序员,而是dba,并且在一段时间内帮助我的一位同事回到了同样的问题。所以,如果这有帮助,请告诉我

System.setProperty("oracle.net.tns_admin", "c:/oracle/network/admin"); 

应该是

System.setProperty("oracle.net.tns_admin", "c://oracle//network//admin"); 

System.setProperty("oracle.net.tns_admin", "c:\\oracle\\network\\admin");

答案 2 :(得分:0)

在tnsnames.ora中查找无效字符。

我有

test, test.WORLD=...

在我的档案中。将其更改为

test.WORLD=

解决了这个问题。