2008-09-17 14 views
21

Mam równoważone obciążeniem (nie używając stanu sesji) aplikację ASP.Net 2.0 na serwerze IIS5, działającą z powrotem do pojedynczej bazy danych Oracle Serwer 10g, korzystający z wersji 10.1.0.301 sterowników ODAC/ODP.Net. Po dłuższym okresie bezczynności (kilka godzin), aplikacja pozornie losowe będzie wyjątek, Oracle:ORA-03113: koniec pliku na kanale komunikacyjnym po długim braku aktywności w aplikacji ASP.Net

wyjątek: ORA-03113: EOF na kanale komunikacyjnym przy Oracle.DataAccess. Client.OracleException.HandleErrorHelper (Int32 errCode, OracleConnection Conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx sRC obiektu, procedura ciąg) w Oracle.DataAccess.Client.OracleCommand.ExecuteReader (logiczna Requery, logiczna fillRequest zachowanie CommandBehavior) co Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader()

... Oracle część stosu kończy się tutaj ...

Tworzymy nowe połączenia na każde żądanie, mają otwartą & blisko owiniętą w try/catch/finally, aby zapewnić prawidłowe zamknięcie połączenia, a całość jest opakowana w blok ({Oracle} using (OracleConnection yadayada). Ten problem nie jest związany z ponownym uruchomieniem aplikacji ASP.Net po spunowaniu w dół dla braku aktywności.

Nie udało się nam jeszcze odtworzyć problemu. Myśli, modlitwy, pomoc?


Więcej: sprawdzone z IT, zapora nie jest ustawiony, aby zabić połączenia między tymi serwerami.

+0

Może ** problemy z łączeniem ** sprawy *** http: //stackoverflow.com/questions/15980979/odp-net-connection-pooling-parameters*** Jak się nazywa twój "ciąg połączenia"? – Kiquenet

Odpowiedz

15

ORA-03113: EOF na kanale komunikacyjnym

Czy baza danych informuje, że połączenie sieciowe już nie istnieje. Może to być spowodowane:

  1. problem z siecią - wadliwego połączenia, lub emisji zapory
  2. Proces serwera w bazie danych, która jest obsługującego niespodziewanie zmarł.

Dla 1) (zapora) wyszukaj tahiti.oracle.com dla SQLNET.EXPIRE_TIME. Jest to parametr sqlnet.ora, który będzie regularnie wysyłać pakiet sieciowy w konfigurowalnym przedziale, tj. Ustawienie to spowoduje, że firewall uwierzy, że połączenie jest aktywne.

za 1) (sieć) skonsultować się z administratorem sieci

Dla 2) Sprawdzić alert.log za błędy, jeśli proces Serwer nie będzie komunikat o błędzie i plik śledzenia będą zostały napisane aby umożliwić wsparcie w celu zidentyfikowania problemu. Komunikat o błędzie odwoła się do pliku śledzenia.

Problemy z pomocą techniczną można zgłaszać na stronie metalink.oracle.com z identyfikatorem nadaje Obsługi Klienta (CSI)

+0

Gdzie jest *** alert.log *** i kiedy jest generowany? – Kiquenet

+0

Dziennik alertów to dziennik bazy danych. Porozmawiaj z administratorem bazy danych i poproś o sprawdzenie znacznika czasu, gdy pojawi się błąd. Powinieneś zawsze patrzeć na ten dziennik dla dowolnego ORA-3113 lub podobnej utraty błędu sesji. –

5

Sprawdź, czy nie jest firewall, który kończy połączenie po określonym czasie (to było przyczyną podobny problem mieliśmy)

+0

Wygląda na to, że masz inny problem niż to, co mieliśmy (chociaż w naszym przypadku IT zapewniało nas również, że nie jest to zapora ogniowa, w końcu ktoś zdał sobie sprawę, że zapora musi zostać ponownie uruchomiona przed zmianą) – hamishmcn

+0

Napotkałem to w instalacja DoD Oracle. Administratorzy sieci lubili konfigurować regułę zapory sieciowej, aby po wielu minutach zatrzasnąć połączenie. Wtedy połączone połączenie zginie podczas następnej operacji. –

1

można spróbować tej sztuczki rejestru:

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

Jeśli to działa, po prostu zachować zwiększenie KeepAliveTime. Obecnie jest ustawiony na 2 minuty.

0

Wspomniany wcześniej artykuł jest dobry. http://forums.oracle.com/forums/thread.jspa?threadID=191750 (o ile jest to możliwe)

Jeśli to nie jest coś, co działa często (nie rób tego na stronie głównej), możesz wyłączyć buforowanie połączeń.

Jest jeszcze jeden "grosz", o którym nie wspomniano w artykule. Jeśli pierwszą rzeczą, którą spróbujesz zrobić z połączeniem, jest wywołanie procedury przechowywanej, ODP będzie HANG !!!! Nie dostaniesz warunek błędu do zarządzania, tylko pełny HANG! Jedynym sposobem, aby to naprawić, jest wyłączenie puli połączeń. Kiedy to zrobiliśmy, wszystkie problemy zniknęły.

Łączenie jest dobre w niektórych sytuacjach, ale kosztem zwiększenia złożoności wokół pierwszego zestawienia każdego połączenia.

Jeśli podejście do obsługi błędów jest tak dobre, dlaczego nie są one opcją dla ODP, aby obsłużyć je dla nas?

7

Dodaj Sprawdź poprawność połączenia = true do ciągu połączenia.

Aby uzyskać więcej informacji, patrz this blog.

SZCZEGÓŁY: Po OracleConnection.Close() rzeczywiste połączenie z bazą danych nie kończy się. Obiekt połączenia jest ponownie umieszczany w puli połączeń. Użycie puli połączeń jest niejawne w ODP.NET. Jeśli utworzysz nowe połączenie, otrzymasz jedną z puli. Jeśli to połączenie jest "jeszcze otwarte", metoda OracleConnection.Open() tak naprawdę nie tworzy nowego połączenia. Jeśli rzeczywiste połączenie zostanie zerwane (z jakiegokolwiek powodu), otrzymasz niepowodzenie w pierwszym wyborze, aktualizacji, wstawieniu lub usunięciu.

Po sprawdzeniu poprawności połączenia prawdziwe połączenie jest sprawdzane w metodzie Open().

+2

Pamiętaj jednak, że ustawienie flagi powoduje ** ** obniżenie wydajności **, zgodnie z [docs] (http://docs.oracle.com/html/E10927_01/featConnecting.htm): 'Ten atrybut powinien być używany tylko gdy jest to absolutnie konieczne, ponieważ powoduje ono w obie strony do bazy danych sprawdzanie poprawności każdego połączenia bezpośrednio przed jego dostarczeniem do aplikacji. " –

+0

Dla shure, twoje absolutnie prawo! Połączenie sprawdzania poprawności wykonuje jedną dodatkową obietę bazy danych, aby upewnić się, że połączenie jest nadal połączone. – Christian13467

+0

Issues *** connectioninging *** http://stackoverflow.com/questions/15980979/odp-net-connection-pooling-parameters i https://collecteddotnet.wordpress.com/2009/05/29/understanding- połączenie-pooling / – Kiquenet

3

EOF na kanale komunikacyjnym:

Jednym z przebiegu tego błędu wynika z bazy danych nie pisać dziennik, gdy jej w fazie otwierania;

Rozwiązanie sprawdzić bazę danych, jeżeli jego prowadzenie w Archivelog lub NOARCHIVELOG

sprawdzić wykorzystanie

select log_mode from v$database; 

jeśli jej na ARCHIVELOG Spróbuj zmienić w NOARCHIVELOG

za pomocą sqlplus

  • Zestaw startowy
  • alter database noarchivelog;
  • alter database open;

czy to działa na tej

Następnie można dostosować swój obszar flashrecovery jej możliwie, że obszar flashrecovery jest pełna -> następnie po stwierdzić, że dana powierzchnia flashrecovery ma miejsca można zmieniać bazy danych do ARCHIVELOG

2

Ten komunikat o błędzie może zostać zgłoszony w dziennikach aplikacji, gdy faktycznym problemem jest brak wolnego miejsca na serwerze bazy danych Oracle.

Po skorygowaniu problemu dotyczącego miejsca, ten konkretny komunikat o błędzie zniknął.

Powiązane problemy