AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Connected=True während der ganzen Programmlaufzeit ?
Thema durchsuchen
Ansicht
Themen-Optionen

Connected=True während der ganzen Programmlaufzeit ?

Ein Thema von hoika · begonnen am 30. Jan 2008 · letzter Beitrag vom 30. Jan 2008
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#1

Connected=True während der ganzen Programmlaufzeit ?

  Alt 30. Jan 2008, 11:30
Datenbank: FB • Version: 1.5 • Zugriff über: FIBPlus, BDE ...
Hallo #,

naja, der Text der Überschrift ist begrenzt

Wie macht ihr das mit dem Connected

1. Connected = True beim Programmstart
Connected = False beim Programmende

2. Connected = True vor jeder Transaktion
Connected = False danach


Ich benutze zur Zeit die 1. Variante.
Das Connect dauerte (damals IB6) je nach Server/Netzwerk ziemlich lange (0.5 sek).

Jetzt habe ich das Problem, dass bei "schlechtem" Netzwerk
mal die Verbindung abreisst -> böser SQL-Fehler wird angezeigt.

OK, man könnte vor jedem Transaktion-Start prüfen, ob die Verbindung noch da ist,
und zur Not die Verbindung wieder aufbauen.

Die 2. Variante finde ich aber besser.
Nur, wie sieht es mit dem Laufzeitverhalten aus ?

Ein Connection-Pool gibt es ja leider (für FB) nicht.

Nutzt jemand die 2. Variante und hat praktische Erfahrungen damit ?


Zum 1.
Wie kann ich schnell feststellen, ob die Verbindung noch besteht ?


Danke


Heiko
Heiko
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Connected=True während der ganzen Programmlaufzeit ?

  Alt 30. Jan 2008, 12:54
Habe mal nachgesehen, im (Haupt)DataModuleCreate steht bei mir Database.Open und eine Transaktion wird gestartet. Lost Connection wegen Netzwerkkabel ziehen und so ? Guck mal dazu auf den FibPlus Seiten. Da müsste genaue Anleitung sein. Sie haben auch spezielle Ereignisse für Database und Dataset. OnLostConnect, DatabaseDisconnect usw. Siehe Artikel.
Gruß
Hansa
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Connected=True während der ganzen Programmlaufzeit ?

  Alt 30. Jan 2008, 13:05
JDBC schickt z.B. vor jedem SQL-Knödel ein 'SELECT 1' zum Server.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Connected=True während der ganzen Programmlaufzeit ?

  Alt 30. Jan 2008, 13:24
Hallo

> Hansa
Meinst du den ?

http://www.devrace.com/en/fibplus/articles/4073.php

> alzaimar
Unter FB wäre das eine select 1 from rdb$database
exec: 3 ms, fetch: 11 ms

Ist eine schöne Belastung fürs Netzwerk ;(


Heiko
Heiko
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Connected=True während der ganzen Programmlaufzeit ?

  Alt 30. Jan 2008, 13:44
Zitat von hoika:
Ist eine schöne Belastung fürs Netzwerk ;(
Nein. Denn es werden 'SELECT 1'+'1' = 8 Bytes + Info = ca. 100 Bytes verschickt = 1 Frame. Eigentlich kein Problem. Aber uncool ist es schon. Der JDBC-Treiber für MSSQL wurde ja auch von Microsoft entwickelt. Wollte halt nur 'ne gängige Schwachsinnslösung vorschlagen.

Wenn es anders geht, dann wäre das natürlich besser.

Ich würde das Verschicken vielleicht zentral kapseln und über ein Try-Except erst die Verbindung ggf. neu aufbauen und danach einen neuen Versuch starten. Ich denke mir, das es auch bei FB zu Deadlock-Situationen kommen kann, bei denen man einen ansonsten unkritischen Befehl nochmals schicken muss. Ich mach das jedenfalls so (bei Deadlock max 3x, ein Reconnect max 1x).

Ich hab mir eh abgewöhnt, mit datensensitiven Steuerelementen zu arbeiten, bastle mir meine SQL selber zusammen und schicke sie über eine einzige Routine, die dann die ganze Deadlock, Reconnect etc. -Logik ausführt. So kann ich mir meine SQL-Batches zu
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Connected=True während der ganzen Programmlaufzeit ?

  Alt 30. Jan 2008, 14:52
Zitat von hoika:
> Hansa
Meinst du den ?
Das ist zumindest einer zum Thema.
Zitat von alzaimar:
..Ich hab mir eh abgewöhnt, mit datensensitiven Steuerelementen zu arbeiten, bastle mir meine SQL selber zusammen und schicke sie über eine einzige Routine, die dann die ganze Deadlock, Reconnect etc. -Logik ausführt. So kann ich mir meine SQL-Batches zu
Bring mal Beispiel.
Gruß
Hansa
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Connected=True während der ganzen Programmlaufzeit ?

  Alt 30. Jan 2008, 15:27
Hallo,

die Transaction-Befehle habe ich auch gekapselt,
dort könnte ich das mit reinpacken.


Heiko
Heiko
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Connected=True während der ganzen Programmlaufzeit ?

  Alt 30. Jan 2008, 15:36
Zitat von Hansa:
Bring mal Beispiel.
So etwa.
Delphi-Quellcode:
Function ExecuteSQL (Const anSQLStmt : String) : TExecuteResult;
  Procedure _InnerExecute;
  Var
    iRetryCount : Integer;

  Begin
    Result := erNone;
    iRetryCount := 0;
    Repeat
      Try
        Connection.Execute (anSQLStmt);
        Result := erOK;
      Except
        On E:EDeadLockException Do Begin
          Result := E.SQLResult;
          inc (iRetrycount);
          Sleep (DELAY_ON_DEADLOCK);
        End;
        On E:ESQLException Do
          Result := E.SQLResult;
      End;
    Until (Result <> erNone) or (RetryCount = MAXRETRIES_ON_DEADLOCK); // z.B. 3
  End;

Begin
  Try
    _InnerExecute;
  Except
    On E:ELostConnectionException Do Begin
      Reconnect;
      _InnerExecute;
    End
  End
End;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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 20:02 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