it-swarm-eu.dev

ORA-03113: Dateiende auf dem Kommunikationskanal nach langer Inaktivität in der ASP.Net-App

Ich habe eine ASP.Net 2.0-App mit Lastenausgleich (ohne Sitzungsstatus) unter IIS5, die auf einem einzelnen Oracle 10g-Server ausgeführt wird und die Version 10.1.0.301 der ODAC/ODP.Net-Treiber verwendet. Nach einer langen Zeit der Inaktivität (einige Stunden) löst die Anwendung scheinbar nach dem Zufallsprinzip eine Oracle-Ausnahme aus:

Ausnahme: ORA-03113: Dateiende auf dem Kommunikationskanal bei Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32-Fehlercode, OracleConnection-Verbindung, IntPtr-Fehlercode, OpoSqlValCtx * pOpoSqlValCtx, Objektzugriffscode) .OracleCommand.ExecuteReader (Boolean Requery, Boolean FillRequest, CommandBehavior-Verhalten) bei Oracle.DataAccess.Client.OracleCommand.System.Data.IDbCommand.ExecuteReader ()

... Oracle Teil des Stapels endet hier ...

Wir erstellen bei jeder Anfrage neue Verbindungen, lassen das Öffnen und Schließen in ein try/catch/finally-Objekt einbinden, um einen ordnungsgemäßen Verbindungsabbau zu gewährleisten, und das Ganze wird in einen using (OracleConnection yadayada) {...} -Block eingebunden. Dieses Problem scheint nicht mit dem Neustart der ASP.Net-Anwendung verbunden zu sein, nachdem sie wegen Inaktivität heruntergefahren wurde.

Wir haben das Problem noch nicht selbst reproduziert. Gedanken, Gebete, Hilfe?


More: Bei der IT-Abteilung ist die Firewall nicht so eingestellt, dass Verbindungen zwischen diesen Servern unterbrochen werden.

23
Greg Hurlman

ORA-03113: Dateiende auf dem Kommunikationskanal

Informiert Sie die Datenbank darüber, dass die Netzwerkverbindung nicht mehr besteht? Dies könnte folgende Gründe haben:

  1. Ein Netzwerkproblem - fehlerhafte Verbindung oder ein Firewall-Problem
  2. Der Serverprozess in der Datenbank, der Sie bedient, ist unerwartet gestorben.

Für 1) (Firewall) suchen Sie auf tahiti.Oracle.com nach SQLNET.EXPIRE_TIME. Dies ist ein sqlnet.ora-Parameter, der regelmäßig ein Netzwerkpaket in einem konfigurierbaren Intervall sendet. Das heißt: Wenn Sie diesen Parameter einstellen, wird die Firewall glauben, dass die Verbindung aktiv ist.

Für 1) (Netzwerk) sprechen Sie mit Ihrem Netzwerkadministrator (Verbindung könnte unzuverlässig sein)

Für 2) Überprüfen Sie die alert.log für Fehler. Wenn der Serverprozess fehlgeschlagen ist, wird eine Fehlermeldung angezeigt. Es wurde auch eine Tracedatei geschrieben, damit der Support das Problem identifizieren kann. Die Fehlermeldung verweist auf die Trace-Datei.

Support-Probleme können unter metalink.Oracle.com mit einem geeigneten Customer Service Identifier (CSI) angesprochen werden.

19
mathewbutler

Fügen Sie Ihrer Verbindungszeichenfolge Validate Connection = true hinzu.

Schauen Sie sich dieses Blog an, um mehr darüber zu erfahren.

DETAILS: Nach OracleConnection.Close () wird die echte Datenbankverbindung nicht beendet. Das Verbindungsobjekt wird wieder in den Verbindungspool gestellt. Die Verwendung des Verbindungspools wird von ODP.NET impliziert. Wenn Sie eine neue Verbindung erstellen, erhalten Sie eine aus dem Pool. Wenn diese Verbindung "noch offen" ist, erstellt die OracleConnection.Open () -Methode nicht wirklich eine neue Verbindung. Wenn die reale Verbindung (aus irgendeinem Grund) unterbrochen wird, tritt beim erstmaligen Auswählen, Aktualisieren, Einfügen oder Löschen ein Fehler auf.

Mit Verbindung validieren wird die reale Verbindung in der Methode Open () validiert.

8
Christian13467

Stellen Sie sicher, dass es keine Firewall gibt, die die Verbindung nach einer bestimmten Zeit beendet (dies war die Ursache für ein ähnliches Problem, das wir hatten).

5
hamishmcn

dateiende auf dem Kommunikationskanal:

Einer der Gründe für diesen Fehler ist, dass die Datenbank das Protokoll nicht schreibt, wenn es sich in der Eröffnungsphase befindet.

Überprüfen Sie die Datenbank, ob sie in ARCHIVELOG oder NOARCHIVELOG ausgeführt wird

verwendung überprüfen

select log_mode from v$database;

wenn es auf ARCHIVELOG ist, versuche es in NOARCHIVELOG zu ändern

mit sqlplus

  • start-Mount
  • alter database noarchivelog;
  • datenbank öffnen;

wenn es dafür funktioniert

Dann können Sie Ihren Flashrecovery-Bereich anpassen. Möglicherweise ist Ihr Flashrecovery-Bereich voll.> Nachdem Sie bestätigt haben, dass Ihr Flashrecovery-Bereich über den Speicherplatz verfügt, können Sie Ihre Datenbank in ARCHIVELOG ändern.

4
Mathias Stanley

Diese Fehlermeldung kann in den Anwendungsprotokollen ausgegeben werden, wenn das eigentliche Problem darin besteht, dass auf dem Oracle-Datenbankserver nicht genügend Speicherplatz verfügbar ist.

Nach dem Korrigieren des Speicherplatzproblems verschwand diese bestimmte Fehlermeldung.

3
Rajesh

Sie könnten diesen Registry-Hack ausprobieren:

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

Wenn es funktioniert, erhöhen Sie einfach das KeepAliveTime weiter. Es ist derzeit auf 2 Minuten eingestellt.

2
Ken Wren

Der zuvor erwähnte Artikel ist gut. http://forums.Oracle.com/forums/thread.jspa?threadID=19175 (soweit es geht)

Wenn dies nicht häufig vorkommt (nicht auf Ihrer Homepage), können Sie das Verbindungspooling deaktivieren.

Es gibt noch ein anderes "gotcha", das im Artikel nicht erwähnt wird. Wenn Sie als Erstes versuchen, eine gespeicherte Prozedur aufzurufen, hängt ODP !!!! Sie werden keine Fehlerbedingung zurückbekommen, nur einen vollen Bohrungs-HANG! Die einzige Möglichkeit, dies zu beheben, besteht darin, das Verbindungspooling auszuschalten. Sobald wir das gemacht haben, sind alle Probleme verschwunden.

Pooling ist in einigen Situationen gut, jedoch auf Kosten einer erhöhten Komplexität um die erste Anweisung jeder Verbindung.

Wenn der Fehlerbehandlungsansatz so gut ist, warum machen sie es nicht für ODP zu einer Option, ihn für uns zu behandeln?

0
Brad Bruce