java.lang.arrayindoxoUtofboundsexception al crear una conexión a una base de datos Oracle

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

  •  29-10-2019
  •  | 
  •  

Pregunta

Parece que el cliente Java de Oracle tiene un error, si el tnsnames.ora El archivo tiene espacios fuera de lugar/pestañas/nuevas líneas en lugares particulares, obtiene una excepción con el siguiente rastro:

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 toma una aplicación C ++ e intenta conectarse con ella a la base de datos con la misma tnsnames.ora En uso: funciona bien. Lo mismo ocurre con sqlplus. También tnsping que debe analizar este archivo no tiene problemas para resolver ningún nombre de servicio. Parece que Oracle era demasiado flojo para .trim() Los valores o algo así, y es el mismo problema con las versiones de Oracle Client 9, 10 y 11.

Cualquier idea de por qué existe este problema y cuál es el problema exacto con el tnsnames.ora ¿formato? (Simplemente elimino todos los espacios blancos para resolverlo)

¿Fue útil?

Solución

Intenté el consejo de Griffeydog pero desafortunadamente no resolvió el problema, así que eventualmente yo también el check for your self approach:

La documentación de Oracle establece que la estructura de un registro en el tnsnames.ora El archivo debe ser como tal:

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

El nuestro era:

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

Aparentemente, la sangría es crucial: si alguna de las líneas en el bloque de un solo net_service_name Comience en el índice 1: se lanza esta excepción.

Solo una vez que agrega sangría a todos (puede ser espacios o pestañas), funciona. No tiene que verse bien, pero tiene que tener una compensación de algún tipo.

Nota importante: el único problema es con '(', las reglas de sangría no se aplican a ')'.
Por ejemplo, el siguiente ejemplo está perfectamente bien:

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

Después de buscar este problema que se documentará, finalmente descubrí que de hecho está documentado en http://download.oracle.com/docs/cd/a57673_01/doc/net/doc/nwus233/apb.htm

Y aquí está el extracto importante:

Incluso si no elige sangrar sus archivos de esta manera, debe sangrar una línea envuelta por al menos un espacio, o se leerá mal como un nuevo parámetro. El siguiente diseño es aceptable:

(Dirección = (Community = TCPCOM.World) (Protocol = TCP)
(Host = max.world) (puerto = 1521))

El siguiente diseño no es aceptable:

(Dirección = (Community = TCPCOM.World) (Protocol = TCP)
(Host = max.world) (puerto = 1521))

Otros consejos

He visto que surgen problemas similares cuando se guarda un archivo de texto con un final de línea de UNIX (LF) versus DOS/Windows Style (CR/LF) o Viceversa. Puede intentar abrir su archivo tnsnames.ora con un editor que admite guardar en ambos formatos para ver si puede corregir el problema de esa manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top