La interrupción de la red hace que el procedimiento almacenado de consultas a través del enlace de la base de datos se cuelgue para siempre

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

Pregunta

Varios procedimientos almacenados que soporto consultan bases de datos remotas a través de una WAN. La red ocasionalmente se cae, pero lo peor que sucedió fue que los procedimientos fallaron y tendrían que reiniciarse.

Las últimas dos semanas ha dado un giro siniestro. En lugar de fallar, los procedimientos se cuelgan en un extraño estado bloqueado. No se pueden matar dentro de Oracle y, siempre que existan, cualquier intento de ejecutar otras copias del procedimiento también se bloqueará. La única solución que hemos encontrado es eliminar los procedimientos ofensivos con un " kill -9 " del sistema operativo. Algunos de estos procedimientos no se han cambiado durante meses, incluso años, por lo que sospecho que hay una causa raíz en la configuración de DB o DB.

¿Alguien tiene alguna idea de lo que podemos hacer para solucionar el problema? ¿O tiene PL / SQL un mecanismo de tiempo de espera que puedo agregar al código para poder crear una excepción que pueda manejar programáticamente?

¿Fue útil?

Solución 2

Nunca pudimos determinar qué causó que esto sucediera. Creemos que fue un defecto en el parche acumulativo de octubre de 2008. Tal vez un parche posterior como lo arregló. No ha sucedido en un par de meses (y hemos tenido algunos cortes de red), así que espero que el problema haya desaparecido.

Otros consejos

¿Qué versión de la base de datos? ¿Están atrapados ejecutando SQL o en PL / SQL? ¿Alguien ha agregado manejo de excepciones en las rutinas recientemente? Recuerdo que en 9iR2, se nos dijo que, en lugar de plantear una excepción a la rutina de llamada, debíamos detectar todas las excepciones y seguir ejecutándolas (básicamente, tratar de ejecutar el proceso de todos los elementos en el trabajo, incluso si alguno falla). Inevitablemente, los trabajos se atascaron en un bucle infinito con errores de SQL, quedando atrapados por el controlador de excepciones e intentando nuevamente. Y no pudieron ser asesinados, ya que CUANDO LOS DEMÁS también capturaron la excepción 'su sesión ha sido asesinada'. Creo que este último cambió en 10 g para que esa excepción no quede atrapada.

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