automatische Wiederherstellung einer Datenbankverbindung

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
KoBraSoft
Beiträge: 130
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: die zu Zeit aktuellen Versionen, überwiegend Linux
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

automatische Wiederherstellung einer Datenbankverbindung

Beitrag von KoBraSoft »

Hallo,
ich habe ein super simples Programm geschrieben, das mir die letzten Einträge einer Datenbank anzeigt:

Code: Alles auswählen

  try
  IBConnection1.Connected:=true;
  SQLQuery1.Close;
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Append('SELECT first 1 ZEITPUNKT, TEMPERATUR FROM DATEN order by 1 DESC');
  SQLQuery1.Open;
  Label1.Caption:=FormatDateTime('hh:nn',SQLQuery1.Fields[0].AsDateTime);
  Label2.Caption:=SQLQuery1.Fields[1].AsString + ' C';
  IBConnection1.Connected:=false;

  except
    Memo1.Lines.Append(FormatDateTime('HH:NN:SS',Now) + ' Verbindung unterbrochen');    
  end;
Diese Prozedur wird von einem Timer jede Minute ausgeführt.

Wenn die WLan verbindung abbricht, kommt diese Meldung
Bildschirmfoto_2025-08-14_18-15-03.png
Bildschirmfoto_2025-08-14_18-15-03.png (26.49 KiB) 758 mal betrachtet
und wartet auf Benutzereingabe. Ich hätte gerne dass das Programm ohne Meldung weiter läuft und einen neuen Verbindungsversuch startet.
Kann man das mit SQLDB realisieren?
Geht das mit ZEOS DBO oder IBX?

Lazarus 4.2 (rev Unknown) FPC 3.2.2 x86_64-linux-gtk2
Konrad

www.KoBraSoft.de

charlytango
Beiträge: 1140
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: automatische Wiederherstellung einer Datenbankverbindung

Beitrag von charlytango »

schneller geschrieben als gedacht -- könnte es sein dass die Messagebox die du zeigst, eine Meldung aus der IBConnection ist und keine Exception? Ki fantasiert was von einer Exception, aber solange ich die Meldung im Code nicht gesehen habe, traue ich dem nicht ganz obwohl si mir ein Codestück präsentiert

Code: Alles auswählen

procedure TIBConnection.DoInternalConnect;
begin
  try
    // Verbindungsaufbau über Firebird/Interbase-Client
    FHandle := some_ib_api_dll_connect(...);
  except
    on E: Exception do
      raise EDatabaseError.Create('DoInternalConnect: - ' + E.Message);
  end;
end;

Ich weiß auch zuwenig über Interbase für eine endgültige Aussage, nur heisst deine Connection IBConnection1 was entweder daran liegt dass sie auf einem eigenen Formular liegt oder es eben nur eine gibt. Für eine Zeitsteuerung würde ich eine eigene (also ggfs zweite) Connection benutzen.

https://wiki.freepascal.org/Try/de

Code: Alles auswählen

  try
    try
        // zu prüfende Anweisungen
      IBConnection1.Connected:=true;
      SQLQuery1.Close;
      SQLQuery1.SQL.Clear;
      SQLQuery1.SQL.Append('SELECT first 1 ZEITPUNKT, TEMPERATUR FROM DATEN order by 1 DESC');
      SQLQuery1.Open;
      Label1.Caption:=FormatDateTime('hh:nn',SQLQuery1.Fields[0].AsDateTime);
      Label2.Caption:=SQLQuery1.Fields[1].AsString + ' C';
    except // Fehlerbehandlung
      on E: EDatabaseError do
        Memo1.Lines.Append(FormatDateTime('HH:NN:SS',Now) + ' Verbindung unterbrochen '+ E.Message);
      on E: Exception do
        ShowMessage('Allgemeiner Fehler: ' + E.Message);
    end;
  finally // immer abzuarbeitende Anweisungen
    IBConnection1.Connected:=false;
    Application.ProcessMessages;
  end; 

ich würde eine gestaffelte Try/Except/finally Konstruktion verwenden.

... und dem WLAN Router ein Mesh spendieren
Zuletzt geändert von charlytango am Fr 15. Aug 2025, 08:55, insgesamt 2-mal geändert.

Benutzeravatar
KoBraSoft
Beiträge: 130
Registriert: So 6. Jun 2021, 09:57
OS, Lazarus, FPC: die zu Zeit aktuellen Versionen, überwiegend Linux
CPU-Target: 64Bit 32 Bit
Kontaktdaten:

Re: automatische Wiederherstellung einer Datenbankverbindung

Beitrag von KoBraSoft »

supi :D
das funktioniert prima.
Ich hätte da noch eine Bonusfrage, die zwar in ein Debian Forum gehört, aber vielleicht hat hier jemand auch eine Antwort:
Der Networkmanager von xfce macht drei Verbindungsversuche und gibt dann auf. Kann man den so einstellen dass er immer wieder versucht die Verbindung aufzubauen, egal wie oft.
Konrad

www.KoBraSoft.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6919
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: automatische Wiederherstellung einer Datenbankverbindung

Beitrag von af0815 »

Das ist leider eines der schwierigsten Themen, wie selbst bestellen müsste. Die Meldung kommt aus dem System und lässt sich auch mit try/except nicht dauerhaft fangen. Vor allen bei Connections die länger offen sind macht das massive Probleme.

Ein workaround ist, vor dem Öffnen oder einer Abfrage einen Ping auf den Server zu machen und erst wenn der OK ist, die Abfrage durchzuführen . Etwas anderes hat bei 24/7 Programmen nicht dauerhaft funktioniert.

Ich habe es weder mit SQLdb noch mit ZEOS geschafft, deswegen die obige Lösung und die hat auch mit SQLdb stabil funktioniert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1140
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: automatische Wiederherstellung einer Datenbankverbindung

Beitrag von charlytango »

habe den code noch etwas detaillierter angepasst -- aber in solch heiklen Fragen würde ich auf die Strategie von af0815 setzte, der durfte solche Themen auf die harte Tour lernen ;-)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6919
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: automatische Wiederherstellung einer Datenbankverbindung

Beitrag von af0815 »

Ich habe mich in den letzten Jahren nicht so intensiv mit ZEOS befasst, aber irgendwo im Hinterkopf, das mit Version 8 bei der Verbindungserkennung etwas verbessert wurde. Allerdings keine Ahnung ob das allgemein ist oder gewisse Treiber betrifft. Auch habe ich es noch nicht getestet.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 434
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: automatische Wiederherstellung einer Datenbankverbindung

Beitrag von Zvoni »

af0815 hat geschrieben: Fr 15. Aug 2025, 08:48 Ein workaround ist, vor dem Öffnen oder einer Abfrage einen Ping auf den Server zu machen und erst wenn der OK ist, die Abfrage durchzuführen . Etwas anderes hat bei 24/7 Programmen nicht dauerhaft funktioniert.
Vorsicht mit diesem Ansatz:
ein erfolgreicher Ping an den Server sagt dir nur, dass die Maschine am Leben ist.
Es macht keine Aussage darüber, ob der Service/Dienst noch am Leben ist.

Der DB-Service/Dienst ist gecrasht, dein Ping an den Server ist jedoch erfolgreich, weil die Maschine ja noch da ist, und schon fliegst du aus der Kurve.

Aber ich stimme zu: Schwieriges Thema.
In so ziemlich allen Posts dazu habe ich immer die Aussage gefunden: Wenn du wissen willst, ob die Verbindung noch da ist, ist das Beste tatsächlich einen Request abzusetzen, gekapselt in einer Try/Catch-Konstruktion
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6919
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: automatische Wiederherstellung einer Datenbankverbindung

Beitrag von af0815 »

Die Praxis zeigt, das es nicht bei allen Treibern mit Try/Except funktioniert. Ich habe da verdammt viel Lehrgeld bei Programmen ohne Nutzer Zugriff bezahlt. Wenn das System Headless oder ohne Benutzer auskommen muss, so war der Ping die einzige stabile Weg.
Warum, wenn der Server aber nicht der Dienst lâuft, so sollte die IT sowieso keine ruhige Minute haben, bzw. die Failsafe Server übernehmen. Und ein Connections check ist ja obligat. Wenn die Strecke zum Server spinnt, weil ein Router Mal ein Update zurU Zeit macht, so ist das durch den Ping gedeckt, ohne laaaaange Connection Checks. Das Konzept läuft so sein fast 20 Jahren in der Produktion (auch schon bei Delphi). Bis jetzt hat mir keiner was stabileres vorstellen können. Aber ich lasse mich gerne überzeugen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten