6

OracleのJavaクライアントにはバグがあるようです。tnsnames.oraファイルの特定の場所にスペース/タブ/新しい行が間違って配置されている場合、次のトレースで例外が発生します。

java.lang.ArrayIndexOutOfBoundsException: <some number>
        at oracle.net.nl.NVTokens.parseTokens(Unknown Source)
        at oracle.net.nl.NVFactory.createNVPair(Unknown Source)
        at oracle.net.nl.NLParamParser.addNLPListElement(Unknown Source)
        at oracle.net.nl.NLParamParser.initializeNlpa(Unknown Source)
        at oracle.net.nl.NLParamParser.<init>(Unknown Source)
        at oracle.net.resolver.TNSNamesNamingAdapter.loadFile(Unknown Source)
        at oracle.net.resolver.TNSNamesNamingAdapter.checkAndReload(Unknown Source)
        at oracle.net.resolver.TNSNamesNamingAdapter.resolve(Unknown Source)
        at oracle.net.resolver.NameResolver.resolveName(Unknown Source)
        at oracle.net.resolver.AddrResolution.resolveAndExecute(Unknown Source)
        at oracle.net.ns.NSProtocol.establishConnection(Unknown Source)
        at oracle.net.ns.NSProtocol.connect(Unknown Source)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1037)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:282)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:468)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:839)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)

C ++アプリケーションを使用して、同じものを使用しているデータベースに接続しようとすると、tnsnames.ora正常に機能します。同じことがsqlplus。またtnsping、このファイルを解析する必要があるのは、サービス名を解決するのに問題はありません。Oracleは値などに対して怠惰すぎたよう.trim()です。これは、Oracleクライアントバージョン9、10、および11でも同じ問題です。

tnsnames.oraこの問題が存在する理由と、フォーマットの正確な問題は何ですか?(私はそれを解決するためにすべての空白を削除するだけです)

4

2 に答える 2

5

GriffeyDog からのアドバイスを試しましたが、残念ながら問題は解決しませんでしたcheck for your self approach

Oracle のドキュメントには、tnsnames.oraファイル内のレコードの構造は次のようにする必要があると記載されています。

net_service_name= 
 (DESCRIPTION=
   (ADDRESS=...)
   (ADDRESS=...)
   (CONNECT_DATA=
    (SERVICE_NAME=sales.us.example.com)))

私たちは:

net_service_name= 
(DESCRIPTION=
(ADDRESS=...)
(ADDRESS=...)
(CONNECT_DATA=
(SERVICE_NAME=sales.us.example.com)))

どうやらインデントは重要です - 単一のブロック内の行のいずれかがnet_service_nameインデックス 1 で始まる場合、この例外がスローされます。

すべてにインデントを追加すると(スペースまたはタブにすることができます)、機能します。見栄えがする必要はありませんが、何らかのオフセットが必要です。

重要な注意 - 唯一の問題は であり'('、インデント規則は には適用されません')'
たとえば、以下の例はまったく問題ありません。

net_service_name= 
     (DESCRIPTION=
       (ADDRESS=...
)
       (ADDRESS=...
)
       (CONNECT_DATA=
        (SERVICE_NAME=sales.us.example.com))
)

この問題を文書化するために検索した後、実際にhttp://download.oracle.com/docs/cd/A57673_01/DOC/net/doc/NWUS233/apb.htmに文書化されていることがわかりました。

そして、ここに重要な抜粋があります:

この方法でファイルをインデントすることを選択しない場合でも、ラップされた行を少なくとも 1 つのスペースでインデントする必要があります。そうしないと、新しいパラメーターとして誤って読み取られます。次のレイアウトが許容されます。

(ADDRESS=(COMMUNITY=tcpcom.world)(PROTOCOL=tcp)
   (HOST=max.world)(PORT=1521))

次のレイアウトは受け入れられません。

(ADDRESS=(COMMUNITY=tcpcom.world)(PROTOCOL=tcp)
(HOST=max.world)(PORT=1521))

于 2011-05-08T05:32:14.137 に答える
2

テキスト ファイルが Unix スタイルの行末 (LF) と DOS/Windows スタイル (CR/LF) で保存された場合、またはその逆で保存された場合に、同様の問題が発生するのを見てきました。両方の形式での保存をサポートするエディターで tnsnames.ora ファイルを開いて、その方法で問題を修正できるかどうかを確認してみてください。

于 2011-05-05T18:45:41.057 に答える