AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Prinzipfrage: bin ich mit Datenbank verbunden ?
Thema durchsuchen
Ansicht
Themen-Optionen

Prinzipfrage: bin ich mit Datenbank verbunden ?

Ein Thema von haentschman · begonnen am 13. Dez 2008 · letzter Beitrag vom 14. Dez 2008
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#1

Prinzipfrage: bin ich mit Datenbank verbunden ?

  Alt 13. Dez 2008, 14:36
Datenbank: firebird • Version: 2.0 • Zugriff über: Zeos
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 )

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ß

Danke für Infos...
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#2

Re: Prinzipfrage: bin ich mit Datenbank verbunden ?

  Alt 13. Dez 2008, 16:20
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#3

Re: Prinzipfrage: bin ich mit Datenbank verbunden ?

  Alt 14. Dez 2008, 09:44
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. 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 ).

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

  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

Re: Prinzipfrage: bin ich mit Datenbank verbunden ?

  Alt 14. Dez 2008, 12:51
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
  Mit Zitat antworten Zitat
Benutzerbild von Wunni
Wunni

Registriert seit: 1. Mai 2003
Ort: Hamburg
46 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Prinzipfrage: bin ich mit Datenbank verbunden ?

  Alt 14. Dez 2008, 13:11
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;
Andreas Wunnenberg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 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