java.lang.arrayindexoutofboundSexception lors de la création d'une connexion à une base de données Oracle

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

  •  29-10-2019
  •  | 
  •  

Question

Il semble que le client Java d'Oracle ait un bug - si le tnsnames.ora Le fichier a des espaces / onglets / tabulations mal placés dans des endroits particuliers, vous obtenez une exception avec la trace suivante:

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)

Si vous prenez une application C ++ et essayez de vous connecter à la base de données avec la même tnsnames.ora In-use - cela fonctionne bien. De même pour sqlplus. Aussi tnsping Ce qui devrait analyser ce fichier n'a aucun problème à résoudre un nom de service. On dirait que Oracle était trop paresseux pour .trim() Les valeurs ou quelque chose - et c'est le même problème avec les versions client Oracle 9, 10 et 11.

Toute idée pourquoi ce problème existe et quel est le problème exact avec le tnsnames.ora format? (Je retire juste tous les espaces blancs pour le résoudre)

Était-ce utile?

La solution

J'ai essayé les conseils de GriffeyDog mais malheureusement cela n'a pas résolu le problème - donc finalement moi aussi le check for your self approach:

La documentation d'Oracle indique que la structure d'un dossier dans le tnsnames.ora Le fichier doit être comme tel:

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

Le nôtre était:

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

Apparemment, l'indentation est cruciale - si l'une des lignes du bloc d'un seul net_service_name Commencez à l'index 1 - Cette exception est lancée.

Une seule fois que vous ajoutez une indentation à tous (peut être des espaces ou des onglets) - cela fonctionne. Cela n'a pas à bien paraître, mais doit avoir un décalage quelconque.

Remarque importante - le seul problème est avec '(', les règles d'indentation ne s'appliquent pas à ')'.
Par exemple, l'exemple ci-dessous est parfaitement bien:

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

Après la recherche de documentation de ce numéro - j'ai finalement découvert qu'il est en effet documenté à http://download.oracle.com/docs/cd/a57673_01/doc/net/doc/nwus233/apb.htm

Et voici l'extrait important:

Même si vous ne choisissez pas de mettre vos fichiers de cette manière, vous devez mettre une ligne enveloppée par au moins un espace, ou il sera mal lu en tant que nouveau paramètre. La disposition suivante est acceptable:

(Adresse = (communauté = tcpcom.world) (protocole = TCP)
(Host = max.world) (port = 1521))

La disposition suivante n'est pas acceptable:

(Adresse = (communauté = tcpcom.world) (protocole = TCP)
(Host = max.world) (port = 1521))

Autres conseils

J'ai vu des problèmes similaires survenir lorsqu'un fichier texte est enregistré avec de la fin des lignes de style UNIX (LF) par rapport au style DOS / Windows (CR / LF), ou vice-versa. Vous pouvez essayer d'ouvrir votre fichier tnsnames.ora avec un éditeur qui prend en charge l'enregistrement dans les deux formats pour voir si vous pouvez corriger le problème de cette façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top