3

我们正在为我们的连接配置使用 OID/LDAP 查找。TNS_ADMIN环境变量和Java 属性都oracle.net.tns_admin设置正确,并指向包含 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);
4

3 回答 3

3

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

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

删除 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 条目以获取连接标识符”,这一切都可以轻松解决!

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

于 2012-10-24T19:37:51.247 回答
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");
于 2012-06-05T13:35:34.737 回答
0

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

我有

test, test.WORLD=...

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

test.WORLD=

解决了这个问题。

于 2016-02-25T11:34:09.663 回答