2008-09-17 9 views
21

Tengo una aplicación ASP.Net 2.0 con carga equilibrada (sin usar el estado de sesión) en IIS5 que se ejecuta en un único Oracle Servidor 10g, utilizando la versión 10.1.0.301 de los controladores ODAC/ODP.Net. Después de un largo período de inactividad (unas horas), la aplicación, aparentemente al azar, va a lanzar una excepción Oracle:ORA-03113: final de archivo en el canal de comunicación después de una larga inactividad en la aplicación ASP.Net

Excepción: ORA-03113: EOF en el canal de comunicación en Oracle.DataAccess. Client.OracleException.HandleErrorHelper (Int32 de errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, src objeto, procedimiento String) en Oracle.DataAccess.Client.OracleCommand.ExecuteReader (requery Boolean, Boolean fillRequest, el comportamiento CommandBehavior) a Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader()

... parte de Oracle de la pila termina aquí ...

Estamos creando nuevas conexiones en cada petición, tienen la abierta & cerca envuelto en un try/catch/finally para asegurar el cierre conexión apropiada, y todo está envuelto en un bloque using (OracleConnection yadayada) {...}. Este problema no aparece vinculado al reinicio de la aplicación ASP.Net después de ser desactivado por inactividad.

Todavía tenemos que reproducir el problema nosotros mismos. Pensamientos, oraciones, ayuda?


Más: controlado con las TI, el firewall no está configurado para matar las conexiones entre esos servidores.

+0

Tal vez ** problemas de agrupamiento de conexiones *** http: //stackoverflow.com/questions/15980979/odp-net-connection-pooling-parameters*** ¿Cómo es su 'cadena de conexión'? – Kiquenet

Respuesta

15

ORA-03113: EOF en el canal de comunicación

Es la base de datos que le informa que la conexión de red ya no existe. Esto podría deberse a que:

  1. un problema de red - conexión defectuosa, o problema de cortafuegos
  2. El proceso del servidor de la base de datos que está dando servicio a usted murió de forma inesperada.

Para 1) (firewall) busque tahiti.oracle.com para SQLNET.EXPIRE_TIME. Este es un parámetro sqlnet.ora que enviará regularmente un paquete de red a un intervalo configurable, es decir: si configura esto, el firewall creerá que la conexión está activa.

Para 1) (red) hablan a su administrador de red

Para 2) Comprobar la alert.log de errores, si el proceso de servidor no habrá un mensaje de error aquí y un archivo de rastreo se habrá escrito para habilitar el soporte para identificar el problema. El mensaje de error hará referencia al archivo de rastreo.

Se pueden generar problemas de soporte en metalink.oracle.com con un identificador adecuado servicio al cliente (CSI)

+0

¿Dónde está *** alert.log *** y cuándo se genera? – Kiquenet

+0

El registro de alerta es un registro lateral de la base de datos. Hable con su DBA y pídales que busquen la marca de tiempo cuando recibe el error. Siempre debe mirar ese registro para detectar cualquier ORA-3113 o una pérdida similar de error de sesión. –

5

Comprobar que no hay un servidor de seguridad que está terminando la conexión después de cierto período de tiempo (esto fue la causa de un problema similar que teníamos)

+0

Parece que tiene un problema diferente al que teníamos (aunque en nuestro caso, también nos aseguró que no era el cortafuegos, al final alguien se dio cuenta de que debía reiniciarse el cortafuegos antes de que se produjera el cambio) – hamishmcn

+0

Lo encontré en una instalación DoD Oracle. A los administradores de red les gusta configurar la regla de firewall para cerrar una conexión luego de tantos minutos. Entonces la conexión mancomunada moriría en la siguiente operación. –

1

Se podría probar este corte del registro:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] 
"DeadGWDetectDefault"=dword:00000001 
"KeepAliveTime"=dword:00120000 

Si funciona, sólo seguir aumentando la KeepAliveTime. Actualmente está configurado para 2 minutos.

0

El artículo mencionado anteriormente es bueno. http://forums.oracle.com/forums/thread.jspa?threadID=191750 (hasta donde llegue)

Si esto no es algo que se ejecuta con frecuencia (no lo haga en su página de inicio), puede desactivar la agrupación de conexiones.

Hay otro "gotcha" que no se menciona en el artículo. Si lo primero que intenta hacer con la conexión es llamar a un procedimiento almacenado, ODP hará HANG !!!! No recibirá una condición de error para administrar, ¡solo HANG de un calibre completo! La única forma de solucionarlo es desactivar la agrupación de conexiones. Una vez que hicimos eso, todos los problemas desaparecieron.

La agrupación es buena en algunas situaciones, pero a costa de una mayor complejidad en torno a la primera declaración de cada conexión.

Si el enfoque de manejo de errores es tan bueno, ¿por qué no lo hacen una opción para que ODP lo maneje para nosotros ????

7

Agregar Validar conexión = verdadero a su cadena de conexión.

Mira this blog para buscar más acerca de.

DETALLES: Después OracleConnection.Close() la conexión de base de datos real no termina. El objeto de conexión se vuelve a poner en el grupo de conexiones. El uso del conjunto de conexiones está implícito en ODP.NET. Si creas una nueva conexión, obtienes una del grupo. Si esta conexión está "abierta", el método OracleConnection.Open() realmente no crea una nueva conexión. Si la conexión real se rompe (por algún motivo) se produce un error al seleccionar, actualizar, insertar o eliminar primero.

Con Validate Connection, la conexión real se valida en el método Open().

+2

Sin embargo, tenga en cuenta que establecer la bandera implica una ** penalización de rendimiento **, de acuerdo con [documentos] (http://docs.oracle.com/html/E10927_01/featConnecting.htm): 'Este atributo debe usarse solo cuando absolutamente necesario, ya que causa un viaje de ida y vuelta a la base de datos para validar cada conexión inmediatamente antes de que se proporcione a la aplicación. –

+0

¡Para Shure, su absolutamente correcto! La conexión Validate realiza una ida y vuelta adicional a la base de datos para garantizar que la conexión aún esté conectada. – Christian13467

+0

Problemas *** agrupación de conexiones *** http://stackoverflow.com/questions/15980979/odp-net-connection-pooling-parameters y https://collecteddotnet.wordpress.com/2009/05/29/understanding- agrupación de conexiones / – Kiquenet

3

de fin de archivo en el canal de comunicación:

Uno del curso de este error se debe a la base de datos deja de escribir el registro cuando su en la fase de apertura;

Solución comprobar la base de datos si su funcionamiento en ARCHIVELOG o NOARCHIVELOG

para comprobar el uso

select log_mode from v$database; 

si es en ARCHIVELOG tratar de cambiar en NOARCHIVELOG

utilizando sqlplus

  • startup mount
  • alter database noarchivelog;
  • alterar la base de datos abierta;

si funciona para este

A continuación, puede ajustar su área flashrecovery su posible que el área de flashrecovery está lleno -> a continuación, después de confirmar que su área de flashrecovery tiene el espacio que puede alterar su base de datos en el ARCHIVELOG

2

Este mensaje de error puede aparecer en los registros de la aplicación cuando el problema real es que el servidor de la base de datos Oracle se quedó sin espacio.

Después de corregir el problema de espacio, este mensaje de error en particular desapareció.

Cuestiones relacionadas