2011-07-01 14 views
11

Estoy desarrollando una aplicación que se supone que debe ejecutarse durante largos períodos y uso extensivo de una base de datos Oracle (11g) a través de ODP.NET.Intenté leer o escribir memoria protegida en Oracle 11g con ODP.NET

Sucede, sin embargo, que de vez en cuando (cada 2 o 3 días) ODP.NET arroja una excepción System.AccessViolationException y luego la aplicación debe reiniciarse. Aquí está mi seguimiento de la pila:

Unhandled exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. 
---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
at Oracle.DataAccess.Client.OpsSql.Prepare2(IntPtr opsConCtx, IntPtr& opsErrCtx, IntPtr& opsSqlCtx, IntPtr& opsDacCtx, OpoSqlValCtx*& pOpoSqlValCtx, string pCommandText, IntPtr& pUTF8CommandText, OpoMetValCtx*& pOpoMetValCtx, Int32 prmCnt) 
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonquery() 

El resto de la traza de la pila es diferente de vez en cuando y se refiere a las llamadas internas de mi solicitud.

Ahora, investigué bastante antes de preguntar aquí, pero no he encontrado nada concluyente. Varias personas aparentemente están experimentando el mismo problema, aunque las causas raíz parecen variar mucho. Realmente espero que alguien tenga una solución para esto :-)

En una nota no relacionada, parece que esta excepción es capaz de ignorar mis bloqueos catch {} y dar como resultado una falla de la aplicación cada vez que ocurre. ¿Es eso porque está relacionado con problemas de corrupción de memoria?

cordiales, Andrea

de edición: una mayor investigación me llevó a creer que podría valer la pena poner en marcha el servicio de "Coordinador de transacciones distribuidas" y ver si la excepción deja de ser lanzada. ¿Qué piensas?

+2

FYI la razón por la que ignora tus bloques try/catch es porque elimina toda la pila de dot.net cuando falla la parte no administrada del código. – tsells

Respuesta

7

Esto es un error. Los proveedores 11.1 y 11.2 tuvieron este problema. La única manera de evitar esto es instalar el cliente 11.2.0.2 y luego aplicar el parche 6.

5

Mientras que la construcción de mi objeto OracleCommand y parámetros añadiendo ...

He encontrado que el cambio de:

select.Parameters.Add("Result", OracleDbType.RefCursor); 

para:

select.Parameters.Add("Result", OracleDbType.RefCursor, ParameterDirection.Output); 

eliminado este problema para mí en el cliente 11.2.0.2.

2

experimentamos la misma AccessViolationException porque un refcursor fue declarado como un parámetro de entrada lugar de salida .

command.Parameters.Add("O_RECS", OracleDbType.RefCursor, null, ParameterDirection.Input); 

Este es un mensaje áspero para un error tan simple. Al cambiar la dirección del parámetro se corrigió el error.

command.Parameters.Add("O_RECS", OracleDbType.RefCursor, null, ParameterDirection.Output); 
Cuestiones relacionadas