Wiederherstellen von Verbindungen (FireDAC)
Nach oben zu Arbeiten mit Verbindungen (FireDAC)
In diesem Thema wird beschrieben, wie in einer instabilen Umgebung gearbeitet wird. FireDAC ermöglicht, dass eine Anwendung nach einem Verbindungsfehler wiederhergestellt werden kann.
Inhaltsverzeichnis
Allgemeine Informationen
Eine Datenbankanwendung kann in einer instabilen Umgebung arbeiten, in der die Verbindung zum Netzwerk physisch unterbrochen sein kann oder der DBMS-Server neu gestartet wurde. Die Anwendung muss von solchen Unterbrechungen nahtlos wiederhergestellt werden und die Kommunikation mit dem DBMS fortsetzen können.
Die automatische Verbindungswiederherstellung von FireDAC ermöglicht die Ermittlung einer abgebrochenen Verbindung und die ordnungsgemäße Reaktion auf diese Situation sowie die Wiederherstellung der Verbindung. Der Verbindungsabbruch wird nur erkannt, wenn eine bestimmte DB-Aktion ausgeführt wird, wie z. B. Open, ExecSQL oder Ping. Der DBMS-Treiber löst in diesem Fall eine EFDDBEngineException mit Kind = ekServerGone
aus.
Am einfachsten lässt sich mit der Methode TFDCustomConnection.Ping ein Verbindungsstatus überprüfen und/oder die Verbindung aktiv halten. Die Ping-Methode kann sogar verwendet werden, wenn eine Verbindung geschlossen ist, um festzustellen, ob eine Verbindung hergestellt werden kann.
Bekannte Einschränkungen:
DBMS | Beschreibung |
---|---|
Advantage Database | Wird für eine lokale freie Verbindung nicht unterstützt. |
dbExpress-Brückentreiber |
|
Informix | DirectExecute muss auf True gesetzt werden. |
Microsoft Access | Nicht unterstützt. |
MySQL | Um Aufrufverzögerungen beim Verbindungsabbruch mit dem Netzwerk so gering wie möglich zu halten, sollten Sie die Verbindungsdefinitionsparameter ReadTimeout und WriteTimeout anpassen. |
ODBC-Brückentreiber |
|
SQLite | Nicht unterstützt. |
Steuern der Verbindungswiederherstellung
Setzen Sie ResourceOptions.AutoReconnect auf True, um die automatische Verbindungswiederherstellung zu aktivieren. Optional können Sie auch die TFDCustomConnection-Ereignisbehandlungsroutinen verwenden:
OnRecover
– zur Reaktion auf das Ereignis des Verbindungsabbruchs und Bereitstellung der nächsten Aktion für FireDAC.OnLosted
– wird ausgelöst, wenn eine Verbindung abgebrochen und nicht wiederhergestellt wurde.OnRestored
– wird ausgelöst, wenn eine Verbindung abgebrochen und wiederhergestellt wurde.
Die Reaktion der TFDCustomConnection.OnRecover-Ereignisbehandlungsroutine kann die Wiederherstellung der Verbindung, der Wechsel in den Offline-Modus oder einfach das Schließen der Verbindung sein. Wenn OnRecover nicht angegeben ist, versucht FireDAC, die Verbindung wiederherzustellen. Zum Beispiel:
procedure TForm1.FDConnection1Recover(ASender: TObject;
const AInitiator: IFDStanObject; AException: Exception;
var AAction: TFDPhysConnectionRecoverAction);
var
iRes: Integer;
begin
iRes := MessageDlg('Connection is lost. Offline - yes, Retry - ok, Fail - Cancel',
mtConfirmation, [mbYes, mbOK, mbCancel], 0);
case iRes of
mrYes: AAction := faOfflineAbort;
mrOk: AAction := faRetry;
mrCancel: AAction := faFail;
end;
Log('Connection is recovering');
end;
Es wird dringend empfohlen, den FireDAC-Manager nicht aus den Ereignisbehandlungsroutinen OnRecover, OnLost und OnRestored zu schließen, weil dies zu unerwarteten Problemen führen kann.
Vorbereiten der Anwendung
Wenn eine Verbindung wiederhergestellt wird, geht Folgendes verloren:
- Aktive Transaktionen werden zurückgesetzt, und die Ausführung wird bei der fehlgeschlagenen Anweisung fortgesetzt.
- Ergebnismengen, die noch nicht abgerufen wurden, werden abgeschnitten, und TFDDataSet.SourceEOF wird auf True gesetzt.
- Der Datenbanksitzungsstatus geht verloren, einschließlich der Status von Oracle-Paketen und Sitzungsvariablen.
- Registrierte Datenbankwarnungen werden deregistriert.
Zur Vorbereitung einer Anwendung für die Arbeit in einer instabilen Umgebung und zur Minimierung von Fehlerauswirkungen legen Sie die folgenden Optionswerte fest:
Option | Wert | |
---|---|---|
fmAll |
||
200 - 300 |
||
True (Vorgabe) | ||
True |
||
True |
Die Anwendung kann den Offline-Verbindungsmodus und CachedUpdates verwenden.