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) 501 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: 1139
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: 6918
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: 1139
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: 6918
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).

Antworten