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?
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