Я занимаюсь разработкой приложения, которое должно работать в течение длительных периодов времени и активно использовать базу данных Oracle (11g) через ODP.NET.
Однако иногда случается, что (каждый2 или 3 дня) ODP.NET создает исключение System.AccessViolationException, а затем необходимо перезапустить приложение.Вот моя трассировка стека:
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()
Остальная часть трассировки стека время от времени отличается и относится к внутренним вызовам из моего приложения.
Теперь я сделал честныйКоличество исследований, прежде чем спрашивать здесь, но я не нашел ничего убедительного.Ряд других людей, очевидно, испытывают ту же проблему, хотя коренные причины, по-видимому, сильно различаются.Я действительно надеюсь, что у кого-то есть решение для этого: -)
На несвязанной ноте кажется, что это исключение способно игнорировать мои блоки catch {} и приводить к сбою приложения при каждом его возникновении.Это потому, что это связано с проблемами повреждения памяти?
С уважением, Андреа
редактировать: дальнейшее расследование привело меня к мысли, что стоит запустить службу «Координатор распределенных транзакций» и посмотреть,исключение перестает быть брошенным.Что ты думаешь?