Tengo un oracle stored proc
que necesita ser llamado desde mi programa Java. Yo había usado CallableStatement
para pasar parámetros al proceso almacenado. Estoy usando el controlador fino de Oracle (configurado en el servidor de lógica web contra la entrada jndi relevante). Este proceso almacenado no tiene ningún valor de SALIDA. Este proceso almacenado acepta un valor numérico y realiza muchas actualizaciones en el DB en función del valor recibido.PreparedStatement, CallableStatement y consideraciones de rendimiento
Obtengo un objeto de conexión y luego llamo a este proceso almacenado en bucle (20 veces para pasar 20 números). Cuando llamo directamente a este proceso almacenado desde un cliente Oracle, la ejecución se completa en 2-3 segundos. Sin embargo, el comportamiento no es predecible desde mi código java. Algunas de las llamadas tardan entre 30 y 40 segundos en completarse.
Intenté usar PreparedStatement
en lugar de CallableStatement
y pude ver una mejora marginal en el rendimiento (aunque el comportamiento sigue siendo inconsistente).
- ¿Está bien en mi caso de usar
PreparedStatement
en lugar deCallableStatement
dado que el storedproc no tiene ningún parámetro OUT? - ¿Hay alguna razón por la que
PreparedStatement
tenga alguna ganancia de rendimiento superior aCallableStatement
o es algo que podría haber observado de forma incorrecta? - ¿Existe un mejor enfoque para resolver este problema de rendimiento?
¿Se puede publicar el código? Alternativamente, confirme que su conexión no se establece con cada iteración (en lugar de usar una conexión repetidamente), y confirme que no está llamando 'conn.prepareCall()' con cada iteración (en lugar de tener '.setInt () 'y' .execute() 'en el bucle). – Matt
Llamas a tu procedimiento almacenado más de una vez, ¿correcto? ¿Has intentado usar llamadas por lotes? http://docs.oracle.com/javase/1.3/docs/guide/jdbc/getstart/callablestatement.html ver 7.1.3 –
En lugar de realizar 20 llamadas, ¿por qué no probar un bloque anónimo de PL/SQL (comenzar ... call proc ... call proc ...... end;) que llama al proceso almacenado 20 veces y hace una llamada a la base de datos con el bloque anónimo. – GriffeyDog