Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Prinzipfrage: bin ich mit Datenbank verbunden ? (https://www.delphipraxis.net/125867-prinzipfrage-bin-ich-mit-datenbank-verbunden.html)

haentschman 13. Dez 2008 14:36

Datenbank: firebird • Version: 2.0 • Zugriff über: Zeos

Prinzipfrage: bin ich mit Datenbank verbunden ?
 
Hallo alle miteinander...

...man könnte auch sagen, wie macht man es richtig.

folgenden Effekt hatte ich zu verzeichnen:

- nachdem ich meine Anwendung ca 2 Tage nicht geschlossen und benutzt hatte meinte wohl der Firebirdserver daß da niemand mehr ist und hat der Connection die Freundschaft gekündigt. Meine Anwendung hat davon aber nichts bemerkt. Ich konnte noch nicht einmal mehr ein "ZConnection.Disconnect" machen ohne daß mir die Fehlermeldungen um die Ohren flogen. (Status der ZConnection war immer noch Connected :gruebel: )

Daraufhin stellten sich mir folgende Fragen:
- macht Ihr vor jeder Aktion mit der Datenbank (Insert,Update...) eine "Testabfrage" ob alle sich melden ?
- läßt sich so etwas auf die Connection beschränken, damit die Testabfrage bei den vielen Querys nicht manuell nachgerüstet werden muß ?
- sollte man mit einem Timer ab und zu ein "select" absetzen damit der Server weis da ist noch jemand ?

PS: ...ich wußte ja noch nicht mit was für Problemen man sich rumschlagen muß :roll:

Danke für Infos...

Reinhard Kern 13. Dez 2008 16:20

Re: Prinzipfrage: bin ich mit Datenbank verbunden ?
 
Hallo,

man könnte schon immer vorher die Verbindung prüfen, aber das würde das Problem auch nicht wirklich lösen. Eine Datenbankverbindung geht eben übers Netzwerk, möglicherweise über ganze Kontinente, und da kann jederzeit ein Problem auftreten - auch in der Sekunde zwischen Test und Update. Einzige Möglichkeit ist daher eine konsistente Behandlung aller ev. auftretenden Fehler, egal wodurch verursacht, und die Anwendung eines Transaktions-Modells, damit keine halben Operationen möglich sind, die die Datenbank inkonsistent machen könnten. Das gilt übrigens auch auf höheren logischen Ebenen, z.B. gehört zu jeder Buchung eine Gegenbuchung (z.B. die Schulden des Kunden werden verringert, die eigenen Einnahmen entsprechend erhöht), fehlt eine, stimmt die Buchhaltung als Ganzes nicht.

Anders gesagt, in einer korrekt ausgekegten DB-Software würde dein geschildertes Problem gar nicht erst auftreten, weil es von der ohnehin nötigen Fehlerbehandlung bereits abgedeckt wäre. Von allen Detailfehlern und ev. erneuten erfolglosen Versuchen sollte dann nur so etwas wie "Transaktion gescheitert" beim User ankommen.

Gruss Reinhard

haentschman 14. Dez 2008 09:44

Re: Prinzipfrage: bin ich mit Datenbank verbunden ?
 
Danke für Deine Antwort...

...nun ja, meinen Daten ging es gut. Alle Schreiboperationen sind über Transaktionen abgesichert. Mein Problem lag ja anders.
In diesem Falle fehlte bei dem "select " die Fehlerbehandlung. :oops: Gut, aber selbst im Falle der Behandlung wäre es nicht möglich gewesen die Connection wieder herzustellen. Im Menü habe ich 2 Punkte für Datenbank verbinden (Connect) Datenbank trennen (Disconnect) je nach Status verfügbar. Da der Status noch auf Connected stand war Datenbank trennen verfügbar. Selbst das Disconnect mündete in dem Verbindungsfehler (Screenshot vergessen :oops: ).

...ist das ein Problemchen der Zeos Komponenten ?
...hilft da einfach ein weiteres Connect ?

:hi:

Reinhard Kern 14. Dez 2008 12:51

Re: Prinzipfrage: bin ich mit Datenbank verbunden ?
 
Zitat:

Zitat von haentschman
...
...ist das ein Problemchen der Zeos Komponenten ?
...hilft da einfach ein weiteres Connect ?

:hi:

Hallo,

wie gesagt, eine Unterbrechung kann jederzeit und ohne eigenes Verschulden auftreten - was soll da anderes helfen als ein erneutes Connect? Die Zeos-Komponenten kenne ich leider nicht. Natürlich gibt es auch diesbezügliche Design-Fehler: ein Telekom-Mitarbeiter hat mir mal erklärt, wenn seine Sitzung durch eine gestörte Verbindung abgebrochen wurde, konnte er sich in ganz Deutschland nicht mehr einloggen, bis ein Operator im Rechenzentrum die hängende Verbindung für beendet erklärte. Ich finde sowas nicht akzeptabel und hoffe deine Software bietet bessere Möglichkeiten.

Ich hatte das Problem so bisher nicht, weil meine Software keine Verbindung länger als ein paar Sekunden offenhält - willst du Kundendaten, wird die Verbindung hergestellt, Daten geholt und die Verbindung geschlossen. Hast du die Kundendaten geändert ebenso. Funktioniert seit mehr als einem Jahrzehnt problemlos.

Gruss Reinhard

Wunni 14. Dez 2008 13:11

Re: Prinzipfrage: bin ich mit Datenbank verbunden ?
 
Hallo,

mit den FIBPlus - Komponenten von Devrace (http://www.devrace.com) kann man prima auf Lost-Connections ragieren.

mögliche Actions:
laCloseConnect: Connection wird geschlossen.
laTerminateApp: Anwendung wird beendet.
laWaitRestore: Verbindung wird wiederhergestellt.

Delphi-Quellcode:
procedure TForm1.dbLostConnect(Database: TFIBDatabase; E: EFIBError;
var Actions: TOnLostConnectActions);
begin
  case meineCombobox.ItemIndex of
    0: begin
         Actions := laCloseConnect;
         MessageDlg('Connection lost. TpFIBDatabase will be closed!',
         mtInformation, [mbOk], 0);
       end;
    1:begin
        Actions := laTerminateApp;
        MessageDlg('Connection lost. Application will be closed!',
        mtInformation, [mbOk], 0);
      end;
    2:Actions := laWaitRestore;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz