java.lang.arrayindexofofboundsexception oracleデータベースへの接続を作成するとき

StackOverflow https://stackoverflow.com/questions/5902150

  •  29-10-2019
  •  | 
  •  

質問

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 このファイルを解析するはずです。サービス名の解決に問題はありません。オラクルはあまりにも怠zyであったようです .trim() 値か何か - そして、それはOracle Clientバージョン9、10、および11と同じ問題です。

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

役に立ちましたか?

解決

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))

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top