2011-07-01 2 views
11

Zajmuję się tworzeniem aplikacji, która ma działać przez długie okresy i szeroko wykorzystywać bazę danych Oracle (11g) za pośrednictwem ODP.NET.Próba odczytu lub zapisu pamięci chronionej w Oracle 11g z ODP.NET

Zdarza się jednak, że raz na jakiś czas (co 2 lub 3 dni) wyjątek System.AccessViolationException jest zgłaszany przez ODP.NET, a następnie aplikacja musi zostać zrestartowana. Oto mój ślad stosu:

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() 

Reszta śladu stosu różni się od czasu do czasu i odnosi się do wewnętrznych połączeń z mojej aplikacji.

Zanim przeprowadziłem tutaj zapytanie, przeprowadziłem sporo badań, ale nie znalazłem nic rozstrzygającego. Wiele osób doświadcza podobnego problemu, chociaż przyczyny źródłowe wydają się bardzo różne. Naprawdę mam nadzieję, że ktoś ma rozwiązanie tego problemu :-)

W przypadku niepowiązanej notatki wygląda na to, że ten wyjątek jest w stanie zignorować moje blokady {} i spowodować awarię aplikacji za każdym razem, gdy wystąpi. Czy to dlatego, że jest to związane z problemami z korupcją pamięci?

Pozdrawiam, Andrea

EDIT: dalsze badania doprowadziły mnie do przekonania, że ​​to może być warte uruchomieniem „Transakcje rozproszone koordynator” usługi i zobaczyć, czy wyjątek przestaje wyrzucane. Co myślisz?

+2

FYI powodem, dla którego ignoruje bloki try/catch, jest to, że usuwa cały stos dot.net, gdy niezarządzana część kodu ulega awarii. – tsells

Odpowiedz

7

To jest błąd. Dostawcy 11.1 i 11.2 mieli ten problem. Jedynym sposobem, aby ominąć to, aby zainstalować klienta 11.2.0.2, a następnie zastosować plaster 6.

5

Podczas konstruowania mojego obiektu OracleCommand i parametry Dodawanie ...

Uważam, że zmiana z:

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

do:

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

Wyeliminowany ten problem dla mnie na kliencie 11.2.0.2.

2

Doświadczyliśmy tego samego AccessViolationException ponieważ RefCursor został uznany jako parametr zamiast Outputwejście.

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

To ostra wiadomość dla tak prostego błędu. Zmiana kierunku parametru naprawiła błąd.

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