2012-06-08 4 views
7

Actualmente estoy trabajando con Java Stored Procedures en Oracle y estoy viendo un comportamiento extraño al intentar obtener una conexión dentro de mi Java código.java.lang.ArithmeticException al intentar obtener conexión en Oracle 11.2.0.2.0 (64 bit)

Mi Java se empaqueta en un archivo jar y luego se implementa en Oracle utilizando la utilidad de línea de comandos loadjava. A continuación, se crea un package en la base de datos que asigna cada método en una clase Java designada a una función PL/SQL mediante especificaciones de llamadas.

Algunas de las columnas con las que estoy trabajando son CLOB s. En el Java intento de extraer el valor de este CLOB (asignada en la especificación llamada como oracle.sql.CLOB) en un String:

private static String getStringFromCLOB(CLOB clob) throws SQLException { 
    long length = clob.length(); 
    return clob.getSubString(1, (int) length); 
} 

Cuando ejecuto el código me sale el siguiente seguimiento de la pila a aparecer en SQL * Plus:

java.lang.ArithmeticException:/by zero 
    at oracle.jdbc.driver.T2SConnection.<init>(T2SConnection.java:107) 
    at oracle.jdbc.driver.T2SDriverExtension.getConnection(T2SDriverExtension.java:31) 
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:481) 
    at oracle.jdbc.driver.OracleDriver.defaultConnection(OracleDriver.java:505) 
    at oracle.sql.DatumWithConnection.getPhysicalConnection(DatumWithConnection.java:53) 
    at oracle.sql.DatumWithConnection.getInternalConnection(DatumWithConnection.java:177) 
    at oracle.sql.CLOB.getDBAccess(CLOB.java:1383) 
    at oracle.sql.CLOB.length(CLOB.java:197) 

Antes de que yo estaba viendo el mensaje de la Exception así que envuelve el contenido del método infractor con una try/catch para que pudiera volcar la traza completa de la System.out.

Merece la pena señalar que He tenido esto trabajando en Oracle 11.2.0.1.0 (32 bits) pero no está funcionando en Oracle 11.2.0.2.0 (64 bits).

También he tenido otro PL/SQL respaldado por Java function s trabajando sin ningún problema. Solo aquellos que intentan hacer una conexión fallan.

He echado un vistazo en <ORACLE_HOME>\jdbc\lib y los frascos, aunque nombrados de la misma manera, parecen ser diferentes en estas dos distribuciones. Los frascos en el directorio son (11.2.0.1.0 y 11.2.0.2.0 tamaño tamaño de muestra):

  • ojdbc5.jar (1,950KB | 1,983KB)
  • ojdbc5_g.jar (3,010KB | 3,271KB)
  • ojdbc5dms.jar (2,374KB | 2,489KB)
  • ojdbc5dms_g.jar (3,030KB | 3,291KB)
  • ojdbc6.jar (2,062KB | 2,102KB)
  • ojdbc6_g.jar (3,323KB | 3,782KB)
  • ojdbc6dms.jar (2,594KB | 2,698KB)
  • ojdbc6dms_g.jar (3,344KB | 3,805KB)
  • simplefan.jar (20KB | 20KB) < - probablemente el mismo

Los archivos de manifiesto de estos frascos confirmar que están construidos para la versión específica, es decir, 11.2.0.1.0 o 11.2.0.2.0. ¿Es posible que se haya introducido un error en 11.2.0.2.0? ¿O es más probable que sea el usuario, es decir, mi error :-)

Además, ¿dónde vive la clase oracle.jdbc.driver.T2SConnection?

Cualquier ayuda/orientación muy apreciada. Por favor, avíseme si necesita más información.

+0

parece un error en el controlador, informe a Oracle o intente/capture, ignore ... (o ambos) – bestsss

Respuesta

0

Para aquellos que puedan encontrar este problema, descubrimos que fue causado por una corrupción de la instalación de JVM dentro de Oracle. Esto probablemente ocurrió debido a una mala instalación.

La reinstalación del aspecto JVM de Oracle permitió que oracle.jdbc.driver.OracleConnection.defaultConnection() se ejecutara sin ningún problema, ya sea explícitamente llamado o llamado como parte de la pila de otra llamada, p. oracle.sql.CLOB.length().

2

Tiene un problema similar con los controladores JDBC de Oracle recientes. Nuestro caso parece ser un problema para mezclar jarrones de diferentes versiones, como 11.2.0.1 y 11.2.0.3, por ejemplo ojdbc6.jar de 11.2.0.1 y oi18n.jar de 11.2.0.3. Una buena técnica es descompilar los frascos enteros del controlador JDBC de Oracle y buscar la línea en el código fuente que provoca el error. Podría proporcionar un consejo sobre el error/error.

Intente utilizar la misma versión del controlador JDBC en ambas máquinas cliente.

oracle.jdbc.driver.T2CConnection vive en cualquier jar principal del controlador, como ojdbc5.jar.

+0

Gracias David. Estoy bastante seguro de que todos los frascos son para 11.2.0.2 pero lo verificaré dos veces. ¿Sabes dónde vive la clase 'oracle.jdbc.driver.T2SConnection' (** S ** en vez de C)? – jabclab

+0

Tienes razón, es un error. 'oracle.jdbc.driver.T2CConnection' existe en cualquier jar principal, como se puede ver simplemente enumerando el contenido de los jars como archivos ZIP normales. 'oracle.jdbc.driver.T2SConnection' no se encuentra en ningún contenedor de Oracle JDBC Drivers 11.2.0. *. Intente encontrar el contenido de jar de la lista de clase en cualquier jar que se encuentre en su servidor, no solo en/lib. –

+0

Gracias por su respuesta David. 'oracle.jdbc.driver.T2SConnection' no parece existir en ningún contenedor dentro de' '. ¿Es posible que pueda ser creado dinámicamente? – jabclab

4

Tuve este problema cuando mi contraseña expiraba. Resolví esto simplemente cambiando la contraseña.

1

Mi código Java/JDBC de repente dejó de funcionar de un día para otro.

Mismo problema aquí. Contraseña expirada Intenté tanto ojdbc6 como ojdbc7. Actualicé mi entorno de VM. El código funcionó bien contra una base de datos diferente.

target_user="c##ora$rman_bkp" 
Placeholder START_DATE=20170422 
Placeholder START_DATE_TIME=2017Apr22-20h47m13s 
jdbcURL='jdbc:oracle:oci8:@twelve_static' 
Exception in thread "main" java.lang.ArithmeticException:/by zero 
     at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:1387) 
     at oracle.jdbc.driver.T2CPreparedStatement.<init>(T2CPreparedStatement.java:109) 
     at oracle.jdbc.driver.T2CDriverExtension.allocatePreparedStatement(T2CDriverExtension.java:81) 
     at oracle.jdbc.driver.PhysicalConnection.prepareStatementInternal(PhysicalConnection.java:2013) 
     at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1960) 
     at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:57) 
     at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1866) 
     at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:57) 
     at LV.verifyLicensedDbId(LV.java:238) 
     at RmanJ.<init>(RmanJ.java:1891) 
     at RmanJ.main(RmanJ.java:1809) 

[email protected]:SQL> select account_status from dba_users where username='c##ora$rman_bkp'; 

ACCOUNT_STATUS 
-------------------------------- 
EXPIRED(GRACE) 

[email protected]:SQL> connect "c##ora$rman_bkp" 
Enter password: 
ERROR: 
ORA-28002: the password will expire within 5 days 


Connected. 
c##[email protected]:SQL> password 
Changing password for "c##ora$rman_bkp" 
Old password: 
New password: 
Retype new password: 
Password changed 

Probé mi código y funcionó bien de nuevo. Otro error increíble en el software de Oracle. Su garantía de calidad nunca lo hace bien. Estoy absolutamente convencido de que ni siquiera tienen planes de prueba adecuados, , de lo contrario, detectarían errores tan graves como la división por cero de una contraseña vencida.