¿Cómo funciona una CallableStatement?

Buen día gente!

Esta vez vengo a consultar con ustedes para ver si alguien tiene una idea o sepa la respuesta exacta de cómo funciona un CallableStatement. Más específicamente mi pregunta surgió a partir de que estoy invocando a un Procedure en Oracle el cuál no tiene ningún valor de retorno, por lo que no espero nada, simplemente lo mando a ejecutar desde Java y después de eso sigo con mi lógica de negocio consultando la BD en base a lo que se supone ejecutó el Procedure. Sé que les viene a la mente el porque no espero una respuesta en ese Procedure para asegurarme de que hizo correctamente lo que tenía que hacer o simplemente que ahí retorne algún valor que ocupo etc, y la cosa a grandes rasgos es que ese procedure internamente comienza a hacer muchos procesos automáticos que van moviendo un elemento de una tabla a otra etc, etc, el chiste es que no retorna nada. Por lo general calculando todo lo que tiene que hacer internamente ese Procedure en promedio es cuestión de Milisegundos, contemplando una carga no tan excesiva de trabajo pudiendo llegar a 3 segundos aproximadamente en responder pero eso ya sería con una carga excesiva de trabajo.

Parece que me contesto sola, pero quiero aún así consultarlo con ustedes. La idea que tengo yo sobre lo que pasa al llamar un Procedure que no tiene valor de retorno con un CallableStatement es que Java sólo espera que al ser llamado ese Procedure lo haya hecho de manera correcta sin esperar a que termine su procesamiento, ¿Es correcto esto? (Corríjanme si no). Por lo que concluyendo, podría pasar que al mandar llamar ese Procedure este esté tardando más de lo debido y cuando yo voy a consultar los "supuestos resultados esperados" aún no estén porque ese Procedure se tardó? Espero haberme dado a entender, si no, pues díganme y les aclaro cualquier cosa.

Más gráficamente:

1-CallableStatement ---> Llama a procedure
2-CallableStatement ---> Verifica que se ejecutara mas no que terminara
3-Si se ejecutó bien
1-Consultas a la BD
.
.
4-Si no
1-Marca error
.
.
.

Entre el paso 2 y 3, en el paso 2 el CallableStatement liberó el recurso y continuó con el paso 3 sin saber si el procedure había terminado.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Hola Marce ...sin esperar a

Hola Marce

...sin esperar a que termine su procesamiento, ¿Es correcto esto? No, se espera a que termine, como la invocación a cualquier método.

Lo que podría desencadenar un comportamiento como el que dices, es que haya trabajos o triggers en tu base de datos que trabajen de forma independiente.

Digamos que tu SP almacena en 5 tablas. Después de que terminó regresa el hilo seguir su ejecución:

callSp();
siguiente(); //aquí

Pero solo hasta que haya terminado todo el SP.

Si por otro lado hay otro programa ( el mismo Oracle ) que está leyendo cada X tiempo esas 5 tablas para insertar en otras 20 ese es otro rollo. Lo mismo pasa con los triggers.

Entonces si en siguiente(); utilizas la tablas 6 ( que no fue modificada directamente por el SP sino que lo será por alguno de esos otros procesos ) puede ser que esa tabla ( o de la 6 a la 20 ) aún no esté lista.

Dicho de otra forma, el llamado a los SP es sincrono ( espera a que termine para seguir con la ejecución )

Saludos.

Imagen de Marce

Gracias

Muchas gracias por la explicación y corrección @OscarRyz =) lo que dices pensandolo bien es muy lógico además de cierto. Era mi mente la que quería verlo así para darle una explicación.

Lo curioso de todo esto y lo que tengo que investigar ahora es cómo es que del valor esperado que procesó y modificó el SP, no se está dando. Se da rara vez, por lo que reproducir ese error en desarrollo y pruebas es algo difícil si no sabes por donde va.
En sí lo que se espera es que en base a la que procesa el SP es que ponga un estatus a un registro y en base a ese estatus poder presentar en Front lo debido para ello, y lo que está ocurriendo es que al momento de ir a leer el estatus que el SP dejó se encuentra con otro, al menos eso quiero pensar yo ya que hasta ahorita de esa forma de ha comportado. Cuando se va a consultar porque arrojó un resultado no esperado te encuentras que el estatus en que dejó el SP al registro es correcto pero en front te arrojó otra cosa.

Estoy pensando en concurrencia, más no sé por donde empezar. Estoy usando Spring MVC como Framework, JDBC para persistencia, JSP con JSTL, no estoy usando un Servlet de Java, todo lo estoy haciendo en una Clase la cuál retorna el valor esperado al Método ModelandView de Spring que es el Controller. Y aquí me surge una duda, ¿Saben ustedes si al llamar a ese controller concurrentemente (varias peticiones a la vez) Spring maneja la concurrencia para que los datos no colisionen y sólo atiende una petición a la vez? Yo tengo entendido que Spring si tiene un mecanismo que maneja la concurrencia, pero lo que no sé es hasta que nivel, tal vez si la maneje liberando peticiones pero tratando de atenderlas de cierta forma "Concurrentemente" para no quitar potencial ya que a final de cuentas se resume a un servlet en java.

Bueno ahí dejo mis incógnitas a ver si tal vez alguien pueda resolverlas ^^

Se me hace difícil pensar que sea falla de concurrencia por parte de Spring ya que nunca me había pasado, pero no descarto que esté dando por hecho algo que puede pasar si no se utiliza bien. Otra cosa es que para variar yo no hice ese código y realmente me encuentro muchas malas prácticas en él que me hacen pensar que tal vez eso sea. En fin, buen día a todos!