2009-12-27 33 views
6

Estamos atrapados en una situación en la que uno de nuestros procesos tarda 3 horas en computar sin tocar la base de datos. La conexión que se tomó antes de llamar al proceso se cierra mediante el servidor Oracle y cualquier consulta subsiguiente o confirmación genera conexión cerrada.Parámetro de tiempo de inactividad IDLE en Oracle

Parece que el problema está relacionado con el cierre de Oracle de la conexión que, por algún motivo, está inactiva durante ese tiempo.

Intentamos cambiar EXPIRE_TIMEOUT en sqlnet.ora, pero eso tampoco ayudó.

¿Qué podemos hacer para resolver este problema?

+1

Si no está utilizando la conexión durante mucho tiempo por qué no cerrarlo y más tarde obtener una nueva conexión cuando lo necesite? Mantener un recurso que no necesita durante tanto tiempo es un desperdicio. –

+0

El código que llama al proceso es un código de un tercero, no puedo hacer mucho al respecto. Lo que escuché de ellos es que tenemos que aumentar el tiempo de espera de la conexión al menos hasta que el proceso regrese. –

Respuesta

7

¿Cuál es el error que se obtiene cuando se intenta utilizar la conexión?

Oracle de forma predeterminada no cerrará una conexión debido a inactividad. Puede configurar un perfil con IDLE_TIME para hacer que Oracle cierre las conexiones inactivas, pero no parece que lo haya hecho. También puede configurar Oracle para detectar conexiones inactivas y cerrar la conexión si el cliente no responde: si el cliente está enterrado durante tres horas, es posible que no responda de manera oportuna. Pero eso parece menos probable y requiere pasos de configuración adicionales.

La situación más probable en mi experiencia es que su red está desconectando la conexión. Si se está conectando a través de un firewall, por ejemplo, el firewall frecuentemente cerrará las conexiones que han estado inactivas demasiado tiempo.

El mensaje de error real de Oracle que está recibiendo indicará cuál de estas alternativas está causando su problema.

0

Independientemente de la base de datos que utilice, no es una buena idea suponer que su conexión estará activa cuando la quiera usar. Una forma de manejar esto es crear una función para devolver una conexión activa a la base de datos en cuestión, y llamarla cada vez que necesite un identificador/objeto/lo que sea para una base de datos dada. La rutina mantiene una lista de bases de datos y su objeto de conexión asociado. Si el objeto de conexión está activo cuando se llama a la función, todo está bien y se devuelve el objeto después de que la función hace algo con él para convencer a la base de datos de que mantenga abierto el handle/object/whatever. Si no hay un objeto de conexión en vivo, la rutina abre una nueva y la devuelve. Es útil tener una segunda rutina que termina en un temporizador que expira después de 1 minuto más o menos. Cuando el temporizador expira y se llama a la segunda rutina, busca en la lista de conexiones de bases de datos, buscando las que no tienen actividad durante un tiempo determinado (algo significativamente menor que el valor de tiempo de espera de la sesión de la base de datos). Aquellos que han estado inactivos durante demasiado tiempo se cierran y limpian.

+0

Gracias por la respuesta, como puede ver mis comentarios sobre la pregunta, es el código de terceros que estamos utilizando y la solución que recomiendan es que aumentemos el parámetro idletimeout. –

3

Irfan,

  1. Por favor asegúrese de que tiene la RESOURCE_LIMIT = true en el archivo init.ora para que los cambios surtan efecto.

  2. Además, compruebe si el usuario al que está intentando establecer el límite está asignado al perfil predeterminado.

select profile from dba_users where username = 'TEST_USER'; 
    PROFILE1 

seleccione el perfil, resource_name, limitar de dba_profiles donde perfil = 'PROFILE1' y
resource_name = 'idle_time'

3 Si el usuario está Asignado a una el perfil personalizado se asegura de que los parámetros para el perfil personalizado estén configurados de manera correspondiente. También debe mirar el parámetro connect_time (en el perfil predeterminado o personalizado que corresponda.) Una vez que se excede el tiempo de conexión, la conexión finaliza.)

Y, por último, tenga en cuenta que si la sesión actual comenzó antes el parámetro fue establecido, no será tenido en cuenta. Los cambios se inician solo a partir de la siguiente sesión después de realizar los cambios.

Enlaces útiles.

http://www.adp-gmbh.ch/blog/2005/april/17.html 
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:453256655431 

Gracias,

Rajesh

+0

init.ora no tiene la variable resource_limit, supongo que se establece en falso de forma predeterminada. Lo que significa que IDLE_TIME está configurado en valores más pequeños donde resource_limit es falso. O está configurado en ILIMITADO. Beacuase si es ilimitado por defecto, no necesito hacer nada. pensamientos –

+0

de la documentación, parece que si resource_limit está establecido en flase (que es el valor predeterminado), deshabilita las ejecuciones de los límites de recursos. No estoy seguro de si esto da un tiempo ilimitado para IDLE_TIME. ¿Qué obtienes al ejecutar seleccionar el perfil de dba_users donde username = ; ? –

+0

Especifique DEFAULT si desea omitir un límite para este recurso en este perfil. Un usuario asignado a este perfil está sujeto al límite de este recurso especificado en el perfil DEFAULT. El perfil DEFAULT define inicialmente recursos ilimitados. Puede cambiar esos límites con la instrucción ALTER PROFILE http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6010.htm#i2065930 –

0

Parece razón real de la connection closed exception es lo mismo que @Justin cueva mencionó en su respuesta:

La situación más probable en mi experiencia es que la red es cortar la conexión. Si se está conectando a través de un cortafuegos, para el ejemplo , el cortafuegos con frecuencia cerrará conexiones que han sido inactivas demasiado tiempo.

El mensaje de error de Oracle real que está recibiendo indicará qué de estas alternativas está causando su problema.

Si todavía alguien quiere saber la IDLE_TIME y CONNECT_TIME configuradas para un perfil, entonces uno puede ejecutar por debajo de consulta:

select * from user_resource_limits user_resource where user_resource.resource_name in ('IDLE_TIME','CONNECT_TIME'); 
Cuestiones relacionadas