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 URL:
    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 Names エントリに複数行にわたる無効なタブ/スペースがあり、正しく解析されないことが問題であることが判明しました。

私たちのケースでは、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

TNSNAmes.ora ファイルが実際に読み取られていることを確認するために sysinternals プロセス モニターをチェックインするとともに、別のエラーが発生しました。これは、TNS ファイルを解析しているが、問題を引き起こしているエントリに何か問題があることを示唆していました。

JDBC Oracle クライアントがより意味のあるエラー、つまり「接続識別子の TNS エントリを解析できません」を返した場合、これはすべて簡単に解決できると思わずにはいられません。

これが他の誰かを助けることを願っています:)

于 2012-10-24T19:37:51.247 に答える
0

tnsnames.ora で無効な文字を探します。

私が持っていた

test, test.WORLD=...

私のファイルで。それをに変更する

test.WORLD=

問題を解決しました。

于 2016-02-25T11:34:09.663 に答える
0

私はプログラマーではなくデータベース管理者であり、同じ問題で同僚を助けたことがあります。これが役立つかどうか教えてください

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 に答える